2009-11-16 31 views
0

在一個Java程序中,我目前正在程序中的某個點處得到「未處理的異常」,我似乎無法確定它正在生成的位置。如何診斷Java中的「未處理的異常」?

它也很難調試代碼,因爲程序包含處理髮送和接收無線數據字節的流。我似乎無法用調試器來模擬。

我應該採用什麼策略來定位異常?

+0

需要更多關於程序類型的ifnormation,無論異常是否是遠程的,如果它的多線程,它運行的是什麼類型的環境等等,以便在操作過程中給予正確的建議。 – cletus

+0

是的程序是多線程的,它有3個併發線程,繪製線程,流讀取器線程和流寫入器線程。我不知道什麼是遠程異常。但是當我運行程序時,設備顯示「未處理的異常」並詢問是否關閉應用程序。如果我選擇不顯示,應用程序仍顯示一些內容,但我想它會掛起。 –

+0

嗯,我可以問你通過添加另一個catch塊來處理什麼樣的異常。你究竟做了什麼? – jitter

回答

1

您可以在代碼的各個部分放置一個try-catch(Exception ex)塊並將其移動/加緊該塊並讓其記錄所拋出的異常。只要沒有太多的代碼,你應該能夠在幾次運行中追蹤它。

+0

好吧,我沒有處理try catch塊中的特定實例,我只處理IO異常,而其他一些類型也被拋出,所以不得不添加另一個catch()和問題解決了! –

+0

@凱文 - 我不知道這是不是你所做的......但是單純地忽略和忽略異常是一個非常糟糕的主意。一個例外是告訴你有什麼不對;例如您程序中的一個錯誤。你應該調查原因並(很可能)修復它。 –

+0

是的。如果你真的無法調試,那麼非處理try-catch塊的想法只是爲了解決你的程序出現問題。從那裏你應該能夠解決出錯的問題並修復你的代碼。 –

1

如果你沒有堆棧跟蹤,你不能做太多。

如果它實際上是在另一端引起的,並且您收到此消息作爲消息,那麼您應該向另一端請求堆棧跟蹤或類似信息。

編輯:當然,你應該確保自己的代碼是不是吞嚥異常等爲:

} catch (Exception e) { 
    // Do nothing. 
} 

} catch (Exception e) { 
    System.out.println("Error"); 
} 

} catch (Exception e) { 
    System.out.println(e.toString()); 
} 

要獲得除了例外情況以外的最多信息,你應該至少做到:

} catch (Exception e) { 
    e.printStackTrace(); 
} 

或只是

} catch (Exception e) { 
    throw e; 
} 

希望這有助於。

11

執行Thread.UncaughtExceptionHandler接口並使用setDefaultUncaughtExceptionHandler()進行設置。

示例程序爲禮貌。如果你使用多線程,你也可以在你懷疑是罪魁禍首的線程上設置處理程序。

public class Test { 
    public static void main(String args[]) { 
     new Test(); 
    } 
    public Test() { 
     Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); 
     // or if a default handler is set you can also use setUncaughtExceptionHandler 
     // check the javadocs for the specifics 
     throw new RuntimeException ("You can't get me or can you?"); 
    } 
    class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { 
     public void uncaughtException(Thread t, Throwable e) { 
      System.err.println ("Uncaught exception by " + t + " caught:"); 
      e.printStackTrace(); 
     } 
    } 
} 
+0

未捕獲異常是否已選中或未選中異常? –

+0

大概他們會是未經檢查的例外。檢查異常無法傳播超出'try {...}'塊。 – harto

+2

大多數時候它們都是未經檢查的異常,但取決於具體的實現方式,它們可能也會被檢查異常。例如如果你已經檢查了你用try-catch處理的異常,但只是在throws子句中聲明它們直到例如main() – jitter

1

但是當我運行該程序的設備 顯示「未處理的異常」,並詢問 我是否關閉應用程序。

首先,您需要在生成此消息的代碼中找到該位置。這聽起來像應用程序有一個GUI或任何,所以它可能是某種對話框。

接下來,在代碼中找到導致創建消息/對話框的位置。它很可能是任一

  • 一個try/catch塊捕獲ExceptionThrowable,或
  • 一個UncaughtExceptionHandler

在任何一種情況下,接下來的事情就是添加一些代碼,使應用程序輸出未捕獲異常的堆棧跟蹤。假設ex保持到異常對象的引用:

ex.printStackTrace(); 

將寫堆棧跟蹤標準錯誤流;例如「控制檯」。 (如果找不到「控制檯」輸出的位置,則有更多的重量級解決方案。)

1

聽起來就像您有未經檢查的RuntimeException發生在某處。你可以在你的main()方法中用try {} catch(Throwable t){t.printStackTrace(); }

或者,如果您使用Eclipse等IDE遠程調試它,則可以將其設置爲通過「掛起未捕獲的異常」在Java異常斷點上觸發調試器。一些文檔here