NullPointerExceptionとは、ぬるぽである。ガッ。
もとい、Javaの代表的な実行時例外のひとつ。NPEと略される。
→ぬるぽ
NullPointerExceptionは、Javaの世界に入門した人間が最初に出会う例外、そして生涯付き合うことになる例外である。NullPointerExceptionをcatchしようなんて思っちゃダメだぞ。
java.lang.Object
+- java.lang.Throwable
+- java.lang.Exception
+- java.lang.RuntimeException
+- java.lang.NullPointerException
値がnullである参照変数に対して、メソッド呼び出しやフィールドアクセスをしたときなどに発生する実行時例外である。
プログラムは、処理をするために数値を保存しておく箱を持っている。→変数
その箱は全てPCの中のどこに置いてあるかを表す住所をもっているが、その住所も数値なのでまた別の箱に入れて置くことができる。Aという箱の住所がBという箱の中に入れられている時、「Bは、Aを指すポインタである」と言う。
ここでもしBの中に何の数値も入っていないのに(→null)Bをポインタとして扱おうとしたら、Bはどの箱の住所も指していないことになるので、エラーが起きる。これがNullPointerException、すなわちNull(数値がない)Pointer(ポインタの)Exception(エラー)なのである。
※Exceptionは厳密にはエラーとイコールではないが、説明が長くなるので後述。
Javaは型があっていなければコンパイルすることすらできないが、型があってさえいればそれなりに動く「型安全」が言語仕様としての特長の一つである。
ところでnullはどうであろうか。nullはすべてのクラスのインスタンスとして代入に使用できる。しかし、nullは一切メソッドを持たないのでいかなるクラスの要件も満たしていない。すなわちnullは「どれでもありながらどれでもないオブジェクト」ということができ、この性質がエラーの原因でもある。
nullはすべての型に値として代入されコンパイルを通ってしまうが、一方でどんなメソッドを呼び出しても動作しない。型安全の例外がnullなのである。
Javaでは、例外をクラスのインスタンスとして指定する。例外に用いることができるクラスは、java.lang.Throwableおよびそのサブクラスに限られる。
Javaでは、例外は大きく分けて3種類ある。
try-catchおよびthrowsの義務が免除される例外。さらに以下の2つに細分化される
java.lang.Error - Javaの仮想マシンに致命的なエラーが発生したなど、通常のプログラムでcatchすべきでない例外。要はメモリ不足やスタックオーバーフローなどである。先述した「厳密にはエラーとイコールではない」というのはこういうことであるjava.lang.RuntimeException - 実行時に自然に発生しうる例外。クラス階層を見ればわかる通り、NullPointerExceptionもこれである。きちんとtry-catchすることが望ましいが、ライブラリで渡されるべき値が予期できており、それ以外の値が来るのがおかしいとかをいちいちアノテーションするのは面倒なわけだから、省略してよいというわけだtry-catchによる自分での例外処理、もしくはthrowsによる例外発出の告知が義務付けられる例外。非チェック例外以外のすべての例外が該当するが、通常java.lang.Exceptionもしくはそのサブクラス(ただしRuntimeExceptionおよびそのサブクラスを除く)を継承する。なお、親クラスもしくは実装インタフェースでthrowsが示されていない場合、オーバーライドもしくは実装するメソッドでthrowsを指定することはできないため、責任をもってtry-catchする必要がある。どうしても必要なら、RuntimeExceptionおよびその派生クラスのインスタンスを構築する際、原因となったThrowableをコンストラクタに渡せるため、渡されるべきでないパラメータが渡されてチェック例外が発生したらそれで逃げてしまう手も取れるJavaの言語仕様に深く根ざした問題であり続けたNullPointerExceptionであったが、2014年、Java8にOptionalクラスが導入されてからは解決の糸口が見えつつある。nullが入りうるところにはOptionalで包んだ値を用い、Optionalから値を取り出すときにnullへの対応を強制することで型安全性を取り戻したのだ。
もっとも、互換性の関係から過去のライブラリ資産へのOptionalクラス導入は進んでおらず、本当に解決されるのは遠い未来のことであるようにも思える。
掲示板
急上昇ワード改
最終更新:2025/12/06(土) 02:00
最終更新:2025/12/06(土) 02:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。