-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