2011-07-20 18 views
2

我的項目有20個未處理的異常,無所謂爲什麼,我想知道它們如何影響JVM?它不會崩潰,但我仍然想知道它們在JVM中的足跡。他們去哪裏?未處理的異常如何影響JVM?

+0

你究竟是什麼意思的未處理的異常?這些例外是否被選中或未選中? –

回答

3

所有異常都由您的代碼或「未捕獲的異常處理程序」處理避免處理異常的唯一方法是從finally塊返回或退出程序。

未處理的異常/錯誤將導致正在運行的線程結束。然而,這是可以接受的迴應,沒有理由需要破壞你的應用程序。

異常的一個問題是它們有一些開銷,如果你創建了過多的數目,它可能會損害性能。

0

任何未被捕獲的ThrowableRuntime ExceptionError)將會終止拋出該throwable的線程。當沒有(非守護進程)線程離開時,JVM進程將退出。

如果您在良好的線程池機制之上運行代碼,線程池將檢測到工作線程死亡並將在其位置創建一個新的工作線程。 我個人believe that you should not catch Throwable,而是捕獲運行時異常。

3

每個線程都有一個叫做UncaughtExceptionHandler的東西。每當你有一個不被任何人捕獲的流浪異常時,調用線程的UncaughtExceptionHandler的uncaughtException方法。通常,線程將終止於未處理的異常。

我不這麼認爲,有很多想到未處理異常與處理異常的性能,因爲異常的唯一主要性能問題是填充堆棧跟蹤,這是在創建異常本身時完成的(構造器結束打電話fillInStackTrace())。如果未處理的異常意味着更小的try-catch塊(如果是這樣的話),那麼你可以從一個角度思考,try-catch的成本通常很高。

+2

直到現在還不知道UncaughtExceptionHandler。 10倍! –

0

JVM完全不受未捕獲的異常的影響。它通常會殺死線程,儘管並非總是如此。在EventQueue的情況下,單個事件異常終止,但事件不斷髮生。

未捕獲的異常並不好。如果你得到20個未處理的異常並且沒有其他問題,你可以通過刪除代碼和生成它們的線程來提高程序的性能;他們顯然沒有做任何需要做的事情(至少從產生例外的行中)。

我對未捕獲的異常帶來的最大問題是它們不穩定程序。一個字段得到一個不好的數字,後來的計算(在其他線程或事件中)使用這個不好的數字,事情從那裏開始下降。有時程序會恢復 - 這在演示中很不錯 - 有時它會慢慢變得越來越糟 - 在演示中,它比異常終止更糟糕。通常無法看到堆棧軌跡。即使應該很明顯,我也知道測試人員和用戶在他們打電話給我之前不能看到它,我已經知道發生了什麼,並告訴他們去尋找它。 (「噢,這是在我的紙牌遊戲。很抱歉,如果我說絕對顯示任何消息。‘NullPointerException異常’,這是否意味着什麼?」)

沒有注意到異常通常看起來像一個計算中的小錯誤。我浪費了很多時間檢查代碼中的拼寫錯誤。只有當我確信程序沒有辦法做到它做到的時候,我才明白那是一個未被捕獲的例外。此外,這些bug可能會非常複雜地重現;該方案變得瘋狂,但在不同的地方,以不同的方式。 (讓你的系統輸出上你的紙牌遊戲的頂部和所有調試問題消失。)

使用Java 1.5,有一種新的方法,Thread.setDefaultUncaughtExceptionHandler,它可以讓你殺程序或以其他方式處理這種威脅。使用大量的try/catch塊可以給你更好的控制(如果你想要的話),並且是在1.5之前處理這個問題的唯一方法(我知道)。