跟踪“隐藏”异常

时间:2011-05-30 16:36:46

标签: java debugging exception

我正在检查我的程序的输出,我不时会看到像“java.lang.NullPointerException”这样的消息而没有别的。因为这不是来自我的代码,我很确定,有一些第三方库,其中一些混蛋做了类似的事情:catch(ex){println ex.getMessage()}。

有没有办法重新启用堆栈跟踪报告并查看问题发生的位置?通过调试器+逐步执行来实现这一点并不容易,因为当我在大量输入数据上运行程序时问题是随机发生的,而如果我尝试重新运行,则无法重现它看似内疚的数据切片。

提前致谢!

2 个答案:

答案 0 :(得分:5)

更新:您最好使用您发现的IDE断点 - 除外。

否则,您可以通过PrintStream设置自定义System.setOut(..),无论何时打印某些内容,都会打印Thread.currentThread().getStackTrace()

理想情况下,您的PrintStream应该包裹原始System.out并发送给它。类似的东西:

public class PrintStreamWrapper extends PrintStream {
    public PrintStreamWrapper(OutputStream out) {
       super(out);
    }

    public void println(String x) {
         StackTraceElement[] trace = Thread.currentThread().getStackTrace();
         // print everything, but not to the System.out, 
         // because you'll end up in a loop.
         super.println(x);
    }   
}

然后,在你的计划开始时:

System.setOut(new PrintStreamWrapper(System.out));

答案 1 :(得分:1)

没有看到代码,很难说。如果经常抛出异常,HotSpot编译器可能实际上优化了周围的代码,以至于VM无​​法生成正确的堆栈跟踪,而Exception#printStackTrace()只会打印异常的类名和消息。

在执行更多操作之前,我会尝试使用-XX:-OmitStackTraceInFastThrow VM参数运行应用程序,以强制VM为所有异常创建正确的堆栈跟踪。