なぜ私NullPointerExceptionいないとらわれることは私のcatchブロック?
-
13-09-2019 - |
質問
私はスレッドを、その日の漁すべての誤差は、より大きく、全てを包含したcatchブロックです。いう報告することができるものとの誤差だけでなく、予想も、私の願います。私のRunnableのようになります。
public final void run()
{
try
{
System.out.println("Do things"); /* [1] */
doUnsafeThings();
}
catch (Throwable t)
{
System.out.println("Catch"); /* [2] */
recover();
}
finally
{
System.out.println("Finally"); /* [3] */
}
}
私は期待のNPEにしか獲ることにより、スロー可能オブジェクトcatchブロックです。その代わりに、出力では[2]を印刷し、関する情報は見つかりませんでした[3]。の出力[1]は印刷済。
たしていくコンソールにはこの:
Uncaught exception java/lang/NullPointerException.
何がいいので、これから
の裁判所の記録で、私が使っているJ2MEこを走る太陽WTK.phpがv2で増えたファイルです。5.2することができます。
私は誘惑を受け入れでJVMの実施dodginessができない感じをしているところで何かが足りない.
明らかに疑義を避けるために付言する(例コードが明らかに変化からプロダクションコード)
- をする時にも、try/catch/finallyブロックの方法。
- があります。ます。println開始時にそれぞれのブロック以下ではそのコンソール諸表は問いません。
解決
答えは私が馬鹿だと判明しました。私は、何が悪かったのかを説明したが、ちょうど「それらのバグの一つ」と呼んでみましょうと思います。
私は一瞬実行可能を実行したスレッドが(いくつかのノキアのバグラウンドを取得するには)カスタム・スレッド・クラスだったことを忘れていました。それはrun()
メソッドの呼び出しの間で繰り返しcanWait()
と呼ばれます。
canWait方法は、失敗の責任があった、と実行は全く失敗していませんでした。それを先頭に、私は完全にコンソール失明とを持っていますが、偶然私の質問に一連のイベントを誤って引用ます。
他のヒント
が鳴ります。私が提案することがあります:
try {
doEvilStuff();
} catch (NullPointerException ex) {
System.out.println("NPE encountered in body");
} catch (Throwable ex) {
System.out.println("Regular Throwable: " + ex.getMessage());
} finally {
etc...
}
例外はtryブロックやキャッチ/ finallyブロック内からであれば、のNullPointerExceptionの明示的なキャッチを有することにより、それが明らかになるはずです。
さて、これは野生の推測です...しかし、それは物事を説明するだろう。
もちろん、あなたのコードではありません。の実際のこと - だから私の推測は、それが何かをログに記録する前に、あなたのキャッチ(または最終的には)ブロックが何かをやっているのどちらかということである、またはのそれは使用していますtryブロックとは異なるロガー。いずれにせよ、私はキャッチまたはfinallyブロックは、例外をスローされるかと思われる。
私はあなたがスタックトレースがあるとしていない...
編集:それはちょうどSystem.out.println
だ場合オーケー、それは強打行くかもしれない引数で何かありますか?たとえばます:
catch (Throwable t) {
// Will go bang if t.getCause() returns null
System.out.println(t.getCause().getMessage());
}
それだけの簡単なSystem.out.println("Constant")
だ場合は、それは非常に奇妙です。
あなたは知っています(例えば、tryブロック内のログの行から)tryブロックが実際に取得しているどのくらい?
それは(回復と思われる)例外がスローされているので、ジョンによって与えられたアドバイスは従って優れていることでしょう。
あなたが私たちにスタックトレースを与えた場合、あなたがより良いの助けを得ることができます。
私は例外をキャッチしようとすると、私はこのような何かをします:
try {
doSomethingBad();
} catch(Exception e) {
try {
LogException(...);
} catch(Exception e) {}
} finally {
}
私は、巣の例外のが好きではありませんが、私は私のcatchブロックを投げた例外を好きではありません。
あなたはRunnable
を使用している言及したよう - 万が一、これはあなたにも、複数のスレッドを使用していることを意味するのでしょうか? doUnsafeThings()
メソッドが内部で再び別のスレッドを生成し、それが例外を生成する場合、あなたはあなたのcatchブロックがあるスレッドでそれを得られない可能性があります。
//java.sun: HTTPを参照してください。 .COM / J2SE / 1.5.0 /ドキュメント/ API / Javaの/ LANG / Thread.UncaughtExceptionHandler.htmlする
一般的にNullPointerExceptionをキャッチする悪い習慣です。
プログラマは、通常、3つの状況下ではNullPointerExceptionをキャッチ
The program contains a null pointer dereference. Catching the resulting exception was easier than fixing the underlying problem.
The program explicitly throws a NullPointerException to signal an error condition.
The code is part of a test harness that supplies unexpected input to the classes under test.
は、これらの3つの状況の中で、唯一の最後は許容されます。このリンクを以下ます:
これは、スレッドがいくつかの他のコードによって殺されていることは可能ですか?一般に、スレッドが異常のどちらかでSystem.exit()または同様のもので、終了されない限り、常に実行します。
finallyブロックまだ見ているのは、コードについて教えてください。にて、 のdoUnsafeThings()ブロックご護のスタックトレース?
ん、ありがとうございますので問題の構築方法、デバッグは、古いバージョンのコードについて教えてください。
だけ)(doUnsafeThingsにいくつかのログを追加します。その方法は、あなたが期待するものをやっているかどうかを確認するために(例えば、最後にトライキャッチを入れて、何かをログ)