我有一个线程,我在其中捕获一个大的、无所不包的 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 - 这些控制台语句后面的内容应该无关紧要。