2015-02-08 45 views
1

當我正在經歷我碰到下面的規則傳來JLS 8 11.2爲什麼會有調用沒有try catch塊靜態無效的主要()

Java編程語言要求程序包含 處理程序檢查可能由執行 方法或構造函數導致的異常(第8.4.6節,第8.8.5節)。此編譯時檢查 是否存在異常處理程序旨在減少未正確處理的異常數。對於每個檢查異常 這是可能的結果,方法或構造函數的throws子句必須提及該異常的類別或該異常的類別的其中一個(第11.2.2.3)類別的其中一個 。

我不明白那條規則的要點。舉例來說,據我所知,這兩個程序

class Main 
{ 
    public static void main (String[] args) throws Exception 
    { 
     throw new Exception(); 
    } 
} 

DEMO

class Main 
{ 
    public static void main (String[] args) throws Exception 
    { 
     try{ 
      throw new Exception(); 
     } catch (Expection e){ } 
    } 
} 

DEMO

是良好的。

但是該規則要求程序包含任何檢查的異常的處理程序,對於第一個不正確的異常。其實,看看處理程序的定義:

每個異常由類Throwable 或它的子類(§11.1)的一個實例表示。這樣的對象可以用來從發生異常的點向攜帶 的信息攜帶 信息。 處理程序通過try 語句(§14.20)的catch子句建立。

強調我的。

所以,在第一個程序是沒有任何處理,但

Java編程語言要求程序包含 處理程序檢查的異常

你能不能澄清這個規則?

+0

拋出基本上是將異常傳遞給調用者。以便呼叫者可以以他自己的方式處理。而在第二個代碼中,你並不需要拋出實際的! – Prashant 2015-02-08 07:06:48

+1

http://programmers.stackexchange.com/questions/257174/how-does-the-jvm-handle-an-exception-thrown-by-the-main-method – Adam 2015-02-08 07:07:12

+0

「對於可能導致的每個檢查異常,方法或構造函數的throws子句必須提及該異常的類別或該異常類別的某個超類別之一。這裏的奧祕是什麼? – Raedwald 2015-02-08 12:04:16

回答

1

這由How does the JVM handle an exception thrown by the main method詳細介紹。

本質上,這是由JVM的內部完成的 - 因此免除了任何JLS規則。如果您願意,您可以覆蓋此行爲。

public static void main(String[] args) throws Exception { 
    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { 

     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      System.out.println("I caught it !" + e); 
     } 
    }); 
    throw new Exception(); 
} 

對於JLS execution chapter,我找不到任何正式的規範,只包括main()的定義。它可能不存在,並不是所有的世界都有很好的記錄。用於java runner的The c code使用JNI。這應該讓你知道發生了什麼,以及爲什麼JLS在這裏無關緊要。

/* Build argument array */ 
mainArgs = NewPlatformStringArray(env, argv, argc); 
if (mainArgs == NULL) { 
    ReportExceptionDescription(env); 
    goto leave; 
} 

/* Invoke main method. */ 
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs); 

/* 
* The launcher's exit code (in the absence of calls to 
* System.exit) will be non-zero if main threw an exception. 
*/ 
ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1; 
+0

謝謝你的迴應,但我正在尋找一個規範性參考。如果你提供一個會很好。 – 2015-02-08 07:19:40