2013-03-27 97 views
0

假設你有一個這樣的代碼是:如何找出拋出異常的位置?

Random rnd=new Random(); 
try { 

    if(rnd.nextInt(1000)==0) { 
    throw new Exception(); 
    } 
    // repeat above code N times, N being big. 

}catch(Exception e) { 
    LOGGER.error("caught:", e); 
} 

現在我添加斷點到追趕條款。如果它得到caugt,我怎麼能找出引發異常的行號?

+0

@RJ再次拿出來:這不是聲望。這是關於發送消息。 – 2013-03-27 15:46:18

+2

堆棧跟蹤應該指出它出錯的地方 – Franklin 2013-03-27 15:48:05

+0

千萬不要拋出'java.lang.Exception'。請。如果你需要寫你自己特定的,但不要拋出'Exception'。之後,你的同事可能會拋棄你。 – 2013-03-27 15:52:07

回答

1

堆棧跟蹤包含此信息。

ideone

堆棧跟蹤:

Exception in thread "main" java.lang.Exception 
    at Main.main(Main.java:8) 
+0

這並非總是正確的,因爲行號可能會丟失,具體取決於編譯器設置。 – Bananeweizen 2013-03-29 07:01:16

+0

@Bananeweizen和爲了討論的java編譯器設置將是那些? – Woot4Moo 2013-03-29 13:32:19

+0

對不起,錯過了:javac -g:none。通過googling「java stacktrace unknown source」找到更多的信息,因爲在這種情況下,「unknown source」是你獲得的而不是「Main.java:8」。 – Bananeweizen 2013-03-29 14:57:38

0

添加一個異常斷點: 「J」

在異常對話框中,按按鈕,然後捕捉異常。

以下是截圖:

http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fviews%2Fbreakpoints%2Fref-addexception_viewaction.htm

+0

這是爲什麼降低投票率?這是所有情況下唯一的工作解決方案,包括無源的第三方二進制代碼。 – Bananeweizen 2013-03-28 07:42:53

+0

@Bananeweizen,他正在回答他自己的問題。 – 2013-03-28 17:40:48

+0

@NikolayKuznetsov自動回答問題可以在stackoverflow上進行,並且不需要downvoting。投票應該判斷答案的內容,而不是發佈者的內容。見http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before-asking – Bananeweizen 2013-03-28 18:54:16

-2

你已經知道的行號,它在它與throw new Exception()行;)

如果你的意思是你想知道有多少次你」已經繞過循環,那麼你可以在你的構造函數中包含循環計數器來處理異常,然後用e.getMessage()

+0

感謝downvote。從閱讀這個問題,我明白只有一行可能拋出異常(因此堆棧跟蹤對於發現錯誤是沒有用的),但是這一行被執行了好幾次 - 因此比「new例外()「應該被拋出。 – Penfold 2013-03-28 09:40:35