5

のようなコード行がない限り、throw new NullPointerException();nullポインターは通常、操作されていることが判明した式のときに発生しnullます。だから、私の質問は、なぜnullポインタのメッセージにnullを返す式が含まれていないのですか?

4

2 に答える 2

4

NullPointerExceptionnullを作成または持っているだけではなく、を逆参照しようとしたときに発生します。スタックトレースにはその行が含まれていますが、これは問題ありません。JVMは、どこnullから来たのかを実際には認識していません。バイトコードをできるだけ速くチャーンしようとすると、そのようなことを追跡しません。


このような状況のデバッグに問題がある場合は、いつでも式を分割して一時変数を使用できます。

String tmp = myObj.getSomething();
String result = tmp.substring(1);

上記の1行目でNullPointerExceptionがスローされた場合(スタックトレースは、内部からではなく、その行からのものであることを示していmyObj.getSomething()ます)、myObjがnullであることがわかります。2行目がNullPointerExceptionをスローした場合、nullであることがわかります。tmpつまり、nullがmyObj.getSomething()返されます。myObj.getSomething()その後、通常の状況で実際にnullが返される可能性があることに気付いた場合は、if (tmp != null) { ... } else { ... }そこにある種のコードを追加できます。

于 2013-03-12T07:28:59.783 に答える
4

確かなことはわかりませんが、JVMが例外をスローした正確な式を報告できなければならない場合、パフォーマンスに大きな問題が発生する可能性があるためだと思います。

少なくとも、(実際には)きめ細かいソースコードの位置情報を含めるには、クラスファイル形式を変更する必要があります...行番号よりもきめ細かい。

とにかく、質問は議論の余地があります...'それはそうではありません。

于 2013-03-12T07:29:38.577 に答える