【Java】NullPointerExceptionとは

コーディングをしていると様々なエラーに遭遇します。

本記事では、Javaで発生する「NullPointerException」についてエラーの意味と解決方法を紹介します。

NullPointerExceptionは、時折ぬるぽと呼ばれ、

2ちゃんねるでガッカリ感・脱力感を表す用語として定着するほど、有名なエラーです。

原因

NullPointerExceptionは、null値が入った参照型変数を使おうとした際に発生する例外です。

用語の説明
  • 例外とは、プログラム上で発生した予期しないエラーです。
  • null値とは、変数に何も入ってないよという意味です。
  • 参照型変数とは、オブジェクトがメモリ内のどこにあるかを参照する型です。
    文字列型や配列、クラス型が該当します。

使おうとしたを具体的に表すと、

  • nullオブジェクトのインスタンス・メソッドの呼出し
  • nullオブジェクトのフィールドに対するアクセスまたは変更
  • nullの長さを配列であるかのように取得
  • nullのスロットを配列であるかのようにアクセスまたは修正
  • nullThrowable値であるかのようにスロー
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/NullPointerException.html

具体例

nullオブジェクトのインスタンス・メソッドの呼出し

public class Main{
    public static void main(String[] args){
        Object Obj = null;
        String toString = Obj.toString();
        System.out.println(toString);
    }
}

3行目の Object Obj = null ; で、Object型のObjをnullで初期化しています。
5行目の String toString = Obj . toString (); で、toStringメソッドを呼び出しています。
これは、nullオブジェクトのインスタンス・メソッドの呼出しによるNullPointerExceptionになります。

nullのスロットを配列であるかのようにアクセスまたは修正

public class Main{
    public static void main(String[] args){
        String[] name = null;
        System.out.println(name[0]);
    }
}

3行目の String [] name = null ; で、文字列型の配列nameをnullで初期化しています。
4行目で、name配列の0番目を表示させようとしています。
これは、nullのスロットを配列であるかのようにアクセスまたは修正したことによるNullPointerExceptionになります。

解決方法

呼び出したメンバ(フィールドやメソッド)がnullになっていないか確認することです。

上の具体例のNullPointerExceptionを回避する方法は、

public class Main{
    public static void main(String[] args){
        Object Obj = new Object();
        String toString = Obj.toString();
        System.out.println(toString);
    }
}

3行目の Object Obj = new Object (); で、Object型のObjをインスタンス化します。

public class Main{
    public static void main(String[] args){
        String[] name = { "tanaka" };
        System.out.println(name[0]);
    }
}

3行目の String name = { “tanaka” }; で、文字列型の配列nameをnullで初期化するのではなく、”tanaka”で宣言しています。