2011-05-30 82 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