支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


NullPointerExceptionとは?

NullPointerExceptionとはnull値の参照型変数を参照しようとした時に発生する例外(エラー)です。

①Java.lang.NullPointerExceptionの意味と主な原因

参照値がnullのオブジェクトに対してメソッドを呼び出そうとしたり、参照値がnullのフィールドに対するアクセスを行おうとして発生するケースが多いですが、レファレンスには以下のように発生するタイミングが記述されています。

1.nullオブジェクトのインスタンス・メソッドの呼び出しをした場合

2.nullオブジェクトのフィールドに対するアクセスまたは変更した場合

3.nullの長さを配列であるかのように取得した場合

4.nullをJava言語のすべてのエラーと例外のスーパークラスであるThrowable値であるかのようにスローした場合

②サンプルコードを見てみよう

nullでメソッドを実行させようとすると、NullPonterException例外が発生します。以下のサンプルコードで確認しましょう。

1.public class NullPointerExceptionSample{

2.   public static void main(String[]args){

3.     String str = null;   //初期値はnull

4.     System.out.println(str.length());

5.   }

6.}

上記のコードを実行すると

1.Exception in thread"main"java.lang.NullPointerException

2.  at NullPointerExceptionSample.main(NullPointerExceptionSample.java:4)

というエラーが発生します。これは「nullオブジェクトのインスタンス・メソッドの呼び出しをした場合」にあてはまります。

NullPointerExceptionの対策方法のそれぞれ

NullPointerExceptionの回避方法は、基本的に参加型変数がnull値かどうか判定すれば回避可能です。しかし、中には間違った方法で回避をしてしまう場合もあります。そのため、「間違った対策方法」と「正しい対策方法」を見ながら回避方法を学びましょう。

①NullPointerExceptionの間違った対策方法

1.例外の握りつぶし・・・「例外の握りつぶし」とは、例外をcatchするがその中では何も処理しないことを言います。

2.例外の上書きスロー・・・「例外の上書きスロー」とは、本来スローされた例外が上書きされ、隠されてしまうことを言います。

3.例外の再スロー・・・「例外の再スロー」とは、catch分で例外をキャッチし、同じ例外をスローしてしまった場合に言います。そうなってしまうと、スタックトレースが汚くなってしまうため例外の発生源を見つけるのが困難になります。

②NullPointerExceptionの正しい対策方法

そもそもNullPointerExceptionの回避方法は、基本的に参加型変数がnull値かどうか判定すれば回避可能です。 先ほどの【②サンプルコードを見てみよう】で記述したサンプルコードのようにnullからメソッドを呼び出したり、nullが許容されていないメソッドの引数にnull値の参照型変数を指定するとNullPointerExceptionの例外が発生して、プログラムが途中で止まる不具合が発生します。それを回避する方法として参照型変数がnullかどうかif文を使って判定する方法がよく使われます。こちらもサンプルコードで確認していきましょう。

1.public class NullPointerExceptionSample{

2.   public static void main(String[]args){

3.     String str = null;   

4.      try{

5.        if(str! = null){

6.         System.out.println(str.length());

7.        } else {

8.         throw new NullPonterException();

9.       }

10.    }catch(NullPointerException e );

11.       e.printStackTrace();

12.    }

13.  }

14.}

上記のコードを実行すると

1.java.lang.NullPointerException

2.  at NullPointerExceptionSample.main(NullPointerExceptionSample.java:8)

このサンプルコードでは、if文を使ってString型の参照型変数strがnullでない場合はstrからlengthメソッドを呼び出しstrの文字数を表示するようになっています。 そしてnullの場合はNullPointerExceptionの例外を発生させ、try-catch文でその例外を捕捉するようにしています。

Optionalを使う方法

先ほどのサンプルコードのように参照型変数がnullかどうかif文を使って判定しました。しかし、Java8からはOptionクラスを使って記述することもできるようになりました。

①Optionalとは

Optionalはメソッドの戻り値としてnullを返す可能性があることを明示的に示したい時に使用します。メソッドがnullを返す可能性があるということを示すことで、そのメソッドを利用するプログラムをより安全に実装することができるようになります。このOptionalクラスを使用するとnullチェック忘れによるエラーやバグを未然に防ぐ役割を果たしてくれます。

②Optionalの生成について

Optionalクラスにはインスタンス生成用のstaticメソッドが用意されているので、これらを使って生成します。

Optional.empty() : 値がnullのOptionalインスタンスを生成します。

Optional.of(値) : 値に対する Optionalインスタンス生成します。

Optional.ofNullable(値) : 値がnullの場合はempty、nullでない場合はofメソッドの結果と同じになります。

まとめ

ここでは、NullPointerExceptionについて説明しました。文字列や配列、リストなどの参照型変数はNullPointerExceptionの例外に対してif文やOptionalクラスを用いて処理を記述する必要があります。慣れて使いこなすことができるように、この記事が例外処理の対策方法として少しでも参考になれば幸いです。最後までお読みいただきありがとうございました。