2011-05-30 100 views
4

我正在检查我的程序的输出,其中有时会看到类似“java.lang.NullPointerException”的消息,而没有其他东西。因为这不是来自我的代码,我敢肯定,有一些第三方库,其中一些混蛋做了类似于:catch(ex){println ex.getMessage()}。跟踪“隐藏”异常

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

在此先感谢!

回答

5

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

否则,您可以通过System.setOut(..)设置自定义PrintStream还有,每当印刷的东西,还打印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

哇!非常感谢!作为另一种选择,我才发现,原来Eclipse是能够打破执行时,抛出一个异常:http://agile.csc.ncsu.edu/SEMaterials/tutorials/eclipse-debugger/#section5_0 – zakmck 2011-05-30 17:03:59

+0

@ user529286是的,这也是一个选项。也许是一个更好的。 – Bozho 2011-05-30 17:06:15

+0

@Bozho:严格地说,包装类应该使用组合而不是继承,正确吗? – 2016-04-15 18:36:39

1

在没有看到代码,就很难说了。如果有异常频繁抛出,热点编译器实际上可能优化周边码了这么多,该虚拟机不能够产生正确的堆栈跟踪和异常#的printStackTrace()将只打印了异常的类名和消息。

之前做任何事情更多,我会尝试使用-XX运行应用程序:-OmitStackTraceInFastThrow VM参数迫使VM创建所有异常正确的堆栈跟踪。

+0

谢谢jambjo,它似乎是我的情况! – zakmck 2011-05-31 13:14:45