0

null オブジェクトでメソッドを呼び出すと、Java が例外をスローするのはなぜですか? 私が理解していることから、例外は「回復可能な」エラーを示しています。ただし、メソッド呼び出しをtryブロックでラップしてから、NullPointerException. nullメソッド呼び出しを行う前に、オブジェクトが存在するかどうかを確認できませんでしたか? null 参照でメソッドを呼び出そうとすると、「回復可能な」エラーではなくプログラマーのエラーを示しているため、プログラムはすぐに中止されてクラッシュするようです。

4

2 に答える 2

4

私が理解していることから、例外は「回復可能な」エラーを示しています。

まあ、それは解釈と問題の例外次第です。多くの場合、実際には多くのことを行うことはできません。

しかし、実際には多くのことができなくても、おそらくプログラム全体をクラッシュさせたくないでしょう。ここでは、エラーをログに記録して (または無視して) 先に進むことが適切な対応です。

ただし、メソッド呼び出しを try ブロックでラップしてから NullPointerException をキャッチする状況は見当たりません。

なぜだめですか?

メソッド呼び出しを行う前に、オブジェクトが null かどうかを確認できませんでしたか?

もちろん。それは非常に一般的なことです。

残念ながら、それは忘れることも非常に一般的です。それは確かにプログラミングエラーです。しかし、プログラミング エラーでさえ、特に頻繁に発生する場合は、適切に処理する必要があります。

null参照でメソッドを呼び出そうとすると、プログラムはすぐに中止されてクラッシュするはずです。

そのために例外が使用されます。

呼び出し元は、それについて何かをしようとするか、単にクラッシュするかを決定できます。

これは、「回復可能な」エラーではなく、プログラマーのエラーを示しているためです。

それも解釈と特殊なケース次第です。たとえば、(API 仕様ごとに) 非 null であると想定されている引数が null であることについて、プログラマーは責任を負うことはできません。


より良い質問は、おそらく「Java に Null があるのはなぜですか?」です。

Null が引き起こすすべての問題 (プログラムが NPE でクラッシュする、またはさらに悪い動作) のため、Null はBillion Dollar Mistakeと呼ばれ、 Scala や Rust などの一部の新しい言語は、Null 値を許可しないことで修正しようとします (代わりに、明示的にOptional 構造で値をラップします)。

于 2013-09-04T01:22:24.097 に答える
2

RuntimeExceptions は通常、特定の操作では回復できないため、それらをキャッチする必要はありませんが、Web サーバー全体がクラッシュnullすることはありません。NullPointerExceptionプログラムのツールがエラーを記録して適切に報告できるようにすると同時に、他の並列操作を続行できるようにします。

于 2013-09-04T01:22:43.110 に答える