繁体   English   中英

为什么即使我总是抛出Exception,我也需要在Java方法中返回一个值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM