JavaマスターJavaプログラムサンプル集例外のサンプル → NullPointerException 対策(その2)

NullPointerException 対策(その2)

NullPointerException が発生する、現実的な例を ご紹介します。

samples/exception/nullpointer/Person.java - Eclipse SDK
package samples.exception.nullpointer;

public class Person {
  String name;
}

samples/exception/nullpointer/NullPointer2.java - Eclipse SDK
package samples.exception.nullpointer;

public class NullPointer2 {
  public static void main(String[] args) {
    try {  
      Person p = new Person();
      // Personオブジェクトのnameフィールドの
      // 文字数を表示します。
      System.out.println(p.name.length());
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

ここでは、新しいクラス「Person」(人)を利用しようとしています。 Personクラスは「name」(名前)というフィールドを持っています。

NullPointer2クラスのmainメソッドでは、 まずPersonクラスのオブジェクトを作成しています。 次に、作成したPersonオブジェクトのnameフィールドに対して lengthメソッドを呼び出し、その結果を表示しています。 (つまり、名前の文字数を表示しようとしています)

ところが、実行すると以下のようにNullPointerExceptionが発生します。 なぜでしょうか?

コマンド プロンプト

C:\JavaMaster\bin>java -cp . samples.exception.nullpointer.NullPointer2 
java.lang.NullPointerException
    at samples.exception.nullpointer.NullPointer2.main(NullPointer2.java:9)

クラスのフィールドが初期化されていない場合に、 フィールドに何が入っているかは、フィールドの型によって決まります。 大雑把には、次のようになります。

  • 数値型 = 0
  • 真理値型(boolean) = false
  • 参照型(クラス、配列) = null

よって、Personクラスのオブジェクトを作成した直後のnameフィールドには、 nullが代入された状態となっています。 したがって、「p.name.length()」 とすると、 前回の例で説明た状況と同じく、nullに対してメソッドを呼び出すこととなり、 NullPointerException 例外を引き起こすのです。