4

第 2 行的语句永远不会执行,但编译器不会抱怨:

class Test {

    public static void main(String[] args) throws Exception {
        throwE();
//        throw new Exception();  // Line 1
        doStuff();                // Line 2
    }

    static void throwE() throws Exception {
        System.out.println("Throwing an Exception");
        throw new Exception();
//        doStuff();              // Line 3
    }

    static void doStuff(){ System.out.println("Doing stuff"); }
}

另一方面,取消注释第 1 行或第 3 行会导致“无法访问的语句”编译时错误。

我想知道为什么编译器如此不一致......

4

1 回答 1

1

编译器不会分析任何方法调用(例如throwE())来确定它是否总是会抛出异常,因为这不切实际。可能有 10 个(或 100 个)方法调用链,其中最后一个方法总是抛出异常。您是否仍然希望编译器确定throwE()在这种情况下后面的任何语句都无法访问?

只有当当前方法总是直接抛出异常时,throw 语句之后的任何语句都被认为是不可达的。

于 2016-07-21T05:37:04.460 回答