すべてのエラーを大きな包括的な 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 が Throwable catch ブロックによってキャッチされることを期待します。代わりに、[2] の出力は印刷されず、[3] も印刷されません。[1] の出力が印刷されます。
コンソールで得られるのは次のとおりです。
Uncaught exception java/lang/NullPointerException.
ここで何が起こっているのですか?
法廷記録のために、私は J2ME を使用しており、これは Sun の WTK v2.5.2 エミュレーターで実行されています。
私はそれを JVM 実装の怪しさのせいだと言いたくなるのですが、何かが足りないと感じずにはいられません。
誤解を避けるために明確にするために(サンプルコードは私の製品コードから明らかに変更されているため)
- run メソッドの try/catch/finally ブロックの外側には何もありません。
- これらの各ブロックの先頭に System.out.println があります。これらのコンソール ステートメントに続くものは重要ではありません。