我有一个线程,在这个线程中,我在一个包罗万象的大 catch block 中捕获所有错误。我这样做是为了报告我的应用程序中的任何错误,而不仅仅是预期的错误。我的 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 block 捕获。相反,[2] 处的输出未打印,[3] 也未打印。打印 [1] 处的输出。
我在控制台上得到的是:
Uncaught exception java/lang/NullPointerException.
这到底是怎么回事?
对于法庭记录,我使用的是 J2ME,它在 Sun 的 WTK v2.5.2 模拟器中运行。
我很想把它归结为 JVM 实现的狡猾,但我忍不住觉得我只是错过了一些东西。
为避免疑惑澄清(因为示例代码显然是从我的生产代码中更改的)
- run 方法中的 try/catch/finally block 之外没有任何内容。
- 在每个 block 的开头都有一个 System.out.println - 这些控制台语句后面的内容无关紧要。
最佳答案
答案证明我是个白痴。我会解释哪里出了问题,但我们只称它为“其中一个错误”。
我暂时忘记了运行 runnable 的线程是一个自定义线程类(为了避免一些诺基亚错误)。它在调用 canWait()
方法之间重复调用 run()
。
canWait 方法是导致失败的原因,而 run 根本没有失败。最重要的是,我对控制台视而不见,完全但不小心错误地引用了我问题中的事件顺序。
关于java - 为什么我的 NullPointerException 没有在我的 catch block 中被捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776765/