为什么我的NullPointerException没有被我的catch块捕获?

izb*_*izb 4 java exception try-catch java-wireless-toolkit java-me

我有一个线程,我在一个大的,无所不包的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] */
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望NPE能被Throwable catch块捕获.相反,不打印[2]处的输出,也不打印[3].打印[1]处的输出.

我在控制台上得到的是:

Uncaught exception java/lang/NullPointerException.
Run Code Online (Sandbox Code Playgroud)

这到底是怎么回事?

对于法庭记录,我正在使用J2ME,这是在Sun的WTK v2.5.2模拟器中运行的.

我很想把它归结为JVM实现的笨拙,但我不禁觉得我只是错过了一些东西.

澄清是为了避免怀疑(因为示例代码明显改变了我的生产代码)

  • run方法中没有try/catch/finally块之外的任何内容.
  • 每个块的开头都有一个System.out.println - 这些控制台语句后面的内容应该无关紧要.

izb*_*izb 6

答案结果证明我是个白痴.我会解释出了什么问题,但让我们把它称为"其中一个错误".

我暂时忘记了运行runnable的线程是一个自定义线程类(绕过一些诺基亚漏洞).它run()在调用canWait()方法之间反复调用.

canWait方法导致失败,并且运行根本没有失败.最重要的是,我有控制台失明,完全但不小心错误地引用了我的问题中的事件序列.

  • 我暂时忘记了运行runnable的线程是一个自定义线程类(绕过一些诺基亚漏洞).它在调用'canWait()'方法之间反复调用run().canWait方法导致失败,并且运行根本没有失败.最重要的是,我有控制台失明,完全但不小心错误地引用了我的问题中的事件序列. (4认同)

Mik*_*ike 5

听起来你需要一些试验和错误.我可以建议:

try {
    doEvilStuff();
} catch (NullPointerException ex) { 
    System.out.println("NPE encountered in body"); 
} catch (Throwable ex) {
    System.out.println("Regular Throwable: " + ex.getMessage());
} finally {
    etc...
}
Run Code Online (Sandbox Code Playgroud)

通过对NullPointerException进行显式捕获,如果异常来自try块或catch/finally块,则应该很明显.