プログラミング入門 JavaのNullPointerExceptionて何?

Javaをやっていると必ず発生する厄介な問題がNullPointerExceptionです。

一体どういう仕組みで発生しているのでしょうか。

以下のコードをご覧ください。

String str = "tamibouz";
System.out.println(str.length());

String型の変数strに対して"tamibouz"という文字列を入れています。

そして、str.length()で文字列の長さを出力しています。

このとき以下のようなことが起きています。

  • 変数strの領域をメモリ上に確保(箱のようなもの)
  • “tamibouz"というStringオブジェクトが生成される
  • “tamibouz"というStringオブジェクトのメモリ上の位置が変数strに入る
  • str.length()では、変数strに入っている位置情報をもとに、Stringオブジェクト(tamibouz)のlength()メソッドを実行する

オブジェクトを変数に入れる場合は、そのオブジェクトそのものを入れているわけではなく、オブジェクトの位置情報(アドレス)を入れていることに注意してください。

続いて、NullPointerExceptionが起きるコードです。

String str = null;
System.out.println(str.length());

この例では、変数strはnullになっているのでメモリの位置情報はもっていません。

さきほど、変数strにはオブジェクトの位置情報が入ると書きましたが、位置情報を参照することをポインターと表現することがあります。

NullPointerのPointerはここからきています。位置情報がない、ということですね。

そのため、str.length()を実行すると、何もないものに対してlength()メソッドを実行しているので、NullPointerExceptionが発生します。

この例では明示的に変数strにnullを入れていますが、実際の開発では気づかぬうちにどこかでnullになってしまった、というケースが大多数です。

NullPointerExceptionを回避する場合、変数がnullかどうかをチェックしてから処理を実行したり、Java8から導入されたOptionalクラスを使ったりという方法がありますので、気になったら調べてみてはいかがでしょうか。