-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が例外をチェックされて、あなたがそれを処理することを余儀なくされているので、私は理解している、スローされるException eを処理していない不満た検討するので、myMethod1_fixed()throws Exceptionを追加し、それが幸せでした。

myMethod2()と表示されていますが、Exception eがスローされますが、がオフの場合はthrows Exceptionがなくても幸いでしたか?

+2

コンパイラは、チェックされた例外が前のブロックで捕捉されたことを知っています。したがって、それは 'RuntimeException'でなければなりません。 – shmosel

+0

すごかったよ。その答えで他の質問に私を指摘してくれてありがとう。したがって、チェックされた例外と未チェックの例外の定義に対する私の理解は正しいです.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; 
} 

にあなたはすでにすべてが例外をチェックしcatched前のcatch句では、チェックされていない例外のみが可能です。

に変更しないでください。この変数を変更するには、eを修正してください。

+0

ありがとう!だから、巧妙なコンパイラがやっていました。「例外」がチェックされなくなったわけではありません。 – user1589188

関連する問題