null オブジェクトでメソッドを呼び出すと、Java が例外をスローするのはなぜですか? 私が理解していることから、例外は「回復可能な」エラーを示しています。ただし、メソッド呼び出しをtry
ブロックでラップしてから、NullPointerException
. null
メソッド呼び出しを行う前に、オブジェクトが存在するかどうかを確認できませんでしたか? null 参照でメソッドを呼び出そうとすると、「回復可能な」エラーではなくプログラマーのエラーを示しているため、プログラムはすぐに中止されてクラッシュするようです。
2 に答える
私が理解していることから、例外は「回復可能な」エラーを示しています。
まあ、それは解釈と問題の例外次第です。多くの場合、実際には多くのことを行うことはできません。
しかし、実際には多くのことができなくても、おそらくプログラム全体をクラッシュさせたくないでしょう。ここでは、エラーをログに記録して (または無視して) 先に進むことが適切な対応です。
ただし、メソッド呼び出しを try ブロックでラップしてから NullPointerException をキャッチする状況は見当たりません。
なぜだめですか?
メソッド呼び出しを行う前に、オブジェクトが null かどうかを確認できませんでしたか?
もちろん。それは非常に一般的なことです。
残念ながら、それは忘れることも非常に一般的です。それは確かにプログラミングエラーです。しかし、プログラミング エラーでさえ、特に頻繁に発生する場合は、適切に処理する必要があります。
null参照でメソッドを呼び出そうとすると、プログラムはすぐに中止されてクラッシュするはずです。
そのために例外が使用されます。
呼び出し元は、それについて何かをしようとするか、単にクラッシュするかを決定できます。
これは、「回復可能な」エラーではなく、プログラマーのエラーを示しているためです。
それも解釈と特殊なケース次第です。たとえば、(API 仕様ごとに) 非 null であると想定されている引数が null であることについて、プログラマーは責任を負うことはできません。
より良い質問は、おそらく「Java に Null があるのはなぜですか?」です。
Null が引き起こすすべての問題 (プログラムが NPE でクラッシュする、またはさらに悪い動作) のため、Null はBillion Dollar Mistakeと呼ばれ、 Scala や Rust などの一部の新しい言語は、Null 値を許可しないことで修正しようとします (代わりに、明示的にOptional 構造で値をラップします)。
RuntimeException
s は通常、特定の操作では回復できないため、それらをキャッチする必要はありませんが、Web サーバー全体がクラッシュnull
することはありません。NullPointerException
プログラムのツールがエラーを記録して適切に報告できるようにすると同時に、他の並列操作を続行できるようにします。