2010-03-09 60 views
1

在一些代碼,我一直在讀,我遇到這樣的:這個異常是在哪裏發現和處理的?

class Someclass 
    { 
     public static void main(String[] args) throws IOException 
     { 
     //all other code here...... 
     } 
    } 

如果主()拋出一個異常,在這種情況下,它的一個IOException,它在哪裏捕捉和處理?

編輯: 這被認爲是不好的做法?或者這在真實世界的代碼中真的很常見?

+2

爲什麼C#的標籤? – 2010-03-09 06:23:45

+0

刪除了C#標記。 – Zaki 2010-03-09 12:41:54

回答

5

完整的未捕獲異常處理的詳細流程如下:How uncaught exceptions are handled in Java

當未捕獲的異常發生時,JVM執行以下操作:

  • 它調用一個特殊的私有方法,dispatchUncaughtException(),在其中發生異常的Thread類;
    • [...其中]調用線程的getUncaughtExceptionHandler()方法找出適當的未捕獲異常處理程序使用。通常情況下,這實際上是線程的父項ThreadGroup,其默認方法handleException()將打印堆棧跟蹤。
  • 然後終止發生異常的線程。

因此你可以,如果你想,創建自己的定製未捕獲的異常處理程序。

還應當指出的是,雖然main是常用的Java應用程序的入口點,方法就像任何其他的方法,它可以也可以從其他上下文調用(例如:其他main方法,甚至本身遞歸!)。在這種情況下,調用者可以捕獲拋出的異常。

public class SelfCatch { 
    public static void main(String args[]) throws Exception { 
     if (args == null) throw new Exception("Hi there!"); 
     try { 
      main(null); 
     } catch (Exception e) { 
      System.out.println("Caught: " + e); 
     } 
     System.out.println("Exiting..."); 
    } 
} 

輸出:

Caught: java.lang.Exception: Hi there! 
Exiting... 
+1

「Java運行時捕獲任何未捕獲的...」 - 我相信這隻適用於運行「main」的線程。默認情況下(即除非某事設置了未捕獲的異常處理程序),其他應用程序創建的線程將不報告未捕獲的異常。 – 2010-03-09 06:26:37

+1

添加到此...只有當這個(主線程)是唯一的線程時,JVM纔會退出,如果有其他線程,它們將繼續運行,直到它們正確退出或由於異常退出。 – saugata 2010-03-09 06:28:53

+0

是的,我的初步答案充滿了不準確之處。請查看當前的修訂版。 – polygenelubricants 2010-03-09 06:52:22

0

在命令行中。

編輯:入門點是Main。因此,沒有其他方法/調用者來處理異常。

+0

這正是我想到的,直到我發現有關UncaughtExceptionHandler(當然在這裏問)。 – Zaki 2010-03-09 08:28:10

1

編輯:這被認爲是不好的做法? 或者這是真的很普遍在現實世界 代碼?

它將在生產代碼中,但是當快速建立原型或敲入測試代碼時,它通常比打字try {...} catch塊更快。 (除非你使用一個像Eclipse 3.5一樣的好的IDE,它具有'自動換行在try/catch'功能[自動檢測任何和所有的例外!] ;-))

或者你確定它不會被拋出由main()調用的方法。

但即便是在try/catch塊通常會導致相同的輸出包裝,如果你離開異常未捕獲,如果單純使用e.printStackTrace()...