プログラミング入門 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クラスを使ったりという方法がありますので、気になったら調べてみてはいかがでしょうか。
ディスカッション
コメント一覧
まだ、コメントがありません