-2

考慮下面的代碼是否檢查了異常或不在JAVA中?

public void myMethod1() { 
    try { 
     this.getClass().getMethod("myMethod").invoke(this); 
    } catch (Exception e) { 
     throw e; 
    } 
} 

public void myMethod1_fixed() throws Exception { 
    try { 
     this.getClass().getMethod("myMethod").invoke(this); 
    } catch (Exception e) { 
     throw e; 
    } 
} 

public void myMethod2() { 
    try { 
     this.getClass().getMethod("myMethod").invoke(this); 
    } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 
    } catch (Exception e) { 
     throw e; 
    } 
} 

myMethod1()在抱怨沒有處理Exception e被拋出,這我理解,因爲Exception檢查異常,你不得不處理它,因此myMethod1_fixed()添加throws Exception,這是幸福的。

現在與myMethod2()它也拋出Exception e,但它很高興,即使沒有throws Exception,意味着Exception未選中?

+2

編譯器知道任何檢查的異常都會在前一個塊中被捕獲,因此它必須是'RuntimeException'。 – shmosel

+0

哇,這很快。謝謝你帶着答案向我指出另一個問題。所以我對定義checked和unchecked異常的理解仍然是正確的,只是從JAVA 7開始,編譯器足夠聰明,可以識別真正的異常類型。但無論如何,沒有必要否定。 – user1589188

回答

2

Rethrowing Exceptions with More Inclusive Type Checking解釋,編譯器認爲可能發生的實際的異常,當你趕上並重新拋出異常,因爲Java 7中

所以在

try { 
    this.getClass().getMethod("myMethod").invoke(this); 
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 
} catch (Exception e) { 
    throw e; 
} 

你已經逮住所有的checked exception在前面的catch子句中,只有未經檢查的異常是可能的。

請注意,您一定不能修改變量e爲此工作。

+0

非常感謝!所以這是一個聰明的編譯器正在做的事情,而不是'Exception'變得沒有選中。 – user1589188

相關問題