のようなコード行がない限り、throw new NullPointerException();
nullポインターは通常、操作されていることが判明した式のときに発生しnull
ます。だから、私の質問は、なぜnullポインタのメッセージにnullを返す式が含まれていないのですか?
2 に答える
NullPointerException
null
を作成または持っているだけではなく、を逆参照しようとしたときに発生します。スタックトレースにはその行が含まれていますが、これは問題ありません。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 { ... }
そこにある種のコードを追加できます。
確かなことはわかりませんが、JVMが例外をスローした正確な式を報告できなければならない場合、パフォーマンスに大きな問題が発生する可能性があるためだと思います。
少なくとも、(実際には)きめ細かいソースコードの位置情報を含めるには、クラスファイル形式を変更する必要があります...行番号よりもきめ細かい。
とにかく、質問は議論の余地があります...'それはそうではありません。