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

时间:2012-03-16 12:30:43

标签: java exception exception-handling

为什么下面的代码没有编译:

    @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语句。对于为什么这是必要的,没有正确的答案。

3 个答案:

答案 0 :(得分:6)

我怀疑它并不确定logAndThrowSpecificException()总是会抛出异常,即使它的目的非常明确,所以testException()结束时可能会这样。要达到。

答案 1 :(得分:2)

  

[...] 据我所知,没有代码路径可以达到这一点?我错过了什么?

一般来说,无法判断某条路径是否可行(标准结果,紧接着是暂停问题)。

因此,编译器不会花费太多精力来分析这些事情。事实上,它甚至不会在当前正在编译的方法之外寻找,这就是为什么你在这种情况下得到错误。

Section 14.21 Unreachable Statements中的Java语言规范中指定了被视为可访问代码的细节。事实上,如果编译器编译了您提供的代码,那将是直接违反规范

答案 2 :(得分:1)

即使logAndTrowSpecificException总是抛出异常似乎很明显,但编译器无法确定这一点。可以在加载时检测类,并将方法的实现替换为不(总是)抛出异常的方法。

关键字:面向方面编程。