为什么下面的代码没有编译:
@Test
public boolean testException() throws MyException {
try {
System.out.println("Try some resource, which may throw an exception");
return resource.getSomething();
} catch (Exception e) {
logAndThrowSpecificException(e);
} finally {
System.out.println("Clean up");
}
}
private void logAndThrowSpecificException(Exception e) throws MyException {
throw new MyException("Checked exception", e);
}
在IntelliJ中它抱怨我需要从testException()方法的最后一行返回一个值,但据我所知,没有代码路径可以达到这一点?我错过了什么?
有similar questions on StackOverflow,但我能找到的最佳解决方案是只输入一个返回null语句。对于为什么这是必要的,没有正确的答案。
答案 0 :(得分:6)
我怀疑它并不确定logAndThrowSpecificException()
总是会抛出异常,即使它的目的非常明确,所以testException()
结束时可能会这样。要达到。
答案 1 :(得分:2)
[...] 据我所知,没有代码路径可以达到这一点?我错过了什么?
一般来说,无法判断某条路径是否可行(标准结果,紧接着是暂停问题)。
因此,编译器不会花费太多精力来分析这些事情。事实上,它甚至不会在当前正在编译的方法之外寻找,这就是为什么你在这种情况下得到错误。
Section 14.21 Unreachable Statements中的Java语言规范中指定了被视为可访问代码的细节。事实上,如果编译器编译了您提供的代码,那将是直接违反规范。
答案 2 :(得分:1)
即使logAndTrowSpecificException
总是抛出异常似乎很明显,但编译器无法确定这一点。可以在加载时检测类,并将方法的实现替换为不(总是)抛出异常的方法。
关键字:面向方面编程。