[英]Why do I need to return a value in a Java method, even if I always throw an Exception?
为什么以下代码无法编译:
@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()方法的最后一行返回一个值,但是据我所知,没有代码路径可以到达那一点? 我想念什么?
在StackOverflow上也有类似的问题 ,但我能找到的最佳解决方案是只将return null语句放入。 没有正确答案说明为什么这样做是必要的。
我怀疑它不确定是否logAndThrowSpecificException()
会始终抛出logAndThrowSpecificException()
异常,即使它的用途很明确,也可能导致testException()
的结尾。
[...] 据我所知,没有代码路径可以到达那一点? 我想念什么?
通常,没有办法确定某条路径是否可行(标准结果是从暂停问题中得出的)。
因此,编译器不会花费太多精力来分析这些东西。 实际上,它甚至不会打扰当前正在编译的方法,这就是为什么在这种情况下会出现错误的原因。
Java语言规范的第14.21节“无法到达的语句”中指定了可到达的代码的详细信息。 实际上,如果编译器编译了您提供的代码,将直接违反规范 。
即使logAndTrowSpecificException
似乎总是抛出异常,编译器也无法肯定地知道这一点。 可以在加载时检测该类,并用不会(始终)引发异常的方法替换该方法的实现。
关键字:面向方面的编程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.