代码中显然有一个无法访问的语句但编译 - 为什么?

The code clearly has an unreachable statement in it yet compiles - why?

第 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 行会导致 'unreachable statement' 编译时错误。

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

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

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