在一個Java程序中,我目前正在程序中的某個點處得到「未處理的異常」,我似乎無法確定它正在生成的位置。如何診斷Java中的「未處理的異常」?
它也很難調試代碼,因爲程序包含處理髮送和接收無線數據字節的流。我似乎無法用調試器來模擬。
我應該採用什麼策略來定位異常?
在一個Java程序中,我目前正在程序中的某個點處得到「未處理的異常」,我似乎無法確定它正在生成的位置。如何診斷Java中的「未處理的異常」?
它也很難調試代碼,因爲程序包含處理髮送和接收無線數據字節的流。我似乎無法用調試器來模擬。
我應該採用什麼策略來定位異常?
您可以在代碼的各個部分放置一個try-catch(Exception ex)塊並將其移動/加緊該塊並讓其記錄所拋出的異常。只要沒有太多的代碼,你應該能夠在幾次運行中追蹤它。
好吧,我沒有處理try catch塊中的特定實例,我只處理IO異常,而其他一些類型也被拋出,所以不得不添加另一個catch()和問題解決了! –
@凱文 - 我不知道這是不是你所做的......但是單純地忽略和忽略異常是一個非常糟糕的主意。一個例外是告訴你有什麼不對;例如您程序中的一個錯誤。你應該調查原因並(很可能)修復它。 –
是的。如果你真的無法調試,那麼非處理try-catch塊的想法只是爲了解決你的程序出現問題。從那裏你應該能夠解決出錯的問題並修復你的代碼。 –
如果你沒有堆棧跟蹤,你不能做太多。
如果它實際上是在另一端引起的,並且您收到此消息作爲消息,那麼您應該向另一端請求堆棧跟蹤或類似信息。
編輯:當然,你應該確保自己的代碼是不是吞嚥異常等爲:
} 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;
}
希望這有助於。
執行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();
}
}
}
但是當我運行該程序的設備 顯示「未處理的異常」,並詢問 我是否關閉應用程序。
首先,您需要在生成此消息的代碼中找到該位置。這聽起來像應用程序有一個GUI或任何,所以它可能是某種對話框。
接下來,在代碼中找到導致創建消息/對話框的位置。它很可能是任一
try
/catch
塊捕獲Exception
或Throwable
,或UncaughtExceptionHandler
。在任何一種情況下,接下來的事情就是添加一些代碼,使應用程序輸出未捕獲異常的堆棧跟蹤。假設ex
保持到異常對象的引用:
ex.printStackTrace();
將寫堆棧跟蹤標準錯誤流;例如「控制檯」。 (如果找不到「控制檯」輸出的位置,則有更多的重量級解決方案。)
聽起來就像您有未經檢查的RuntimeException發生在某處。你可以在你的main()方法中用try {} catch(Throwable t){t.printStackTrace(); }
或者,如果您使用Eclipse等IDE遠程調試它,則可以將其設置爲通過「掛起未捕獲的異常」在Java異常斷點上觸發調試器。一些文檔here。
需要更多關於程序類型的ifnormation,無論異常是否是遠程的,如果它的多線程,它運行的是什麼類型的環境等等,以便在操作過程中給予正確的建議。 – cletus
是的程序是多線程的,它有3個併發線程,繪製線程,流讀取器線程和流寫入器線程。我不知道什麼是遠程異常。但是當我運行程序時,設備顯示「未處理的異常」並詢問是否關閉應用程序。如果我選擇不顯示,應用程序仍顯示一些內容,但我想它會掛起。 –
嗯,我可以問你通過添加另一個catch塊來處理什麼樣的異常。你究竟做了什麼? – jitter