代码中显然有一个无法访问的语句,但可以编译 - 为啥? [复制]

Posted

技术标签:

【中文标题】代码中显然有一个无法访问的语句,但可以编译 - 为啥? [复制]【英文标题】:The code clearly has an unreachable statement in it yet compiles - why? [duplicate]代码中显然有一个无法访问的语句,但可以编译 - 为什么? [复制] 【发布时间】:2016-11-24 12:52:17 【问题描述】:

第 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 行会导致“无法访问语句”编译时错误。

不知道为什么编译器这么不一致...

【问题讨论】:

在第一种情况下,编译器只知道有一个方法会抛出Exception,但不能保证这个方法能做到。第二种情况,无论如何都会抛出异常。 另外,How can I detect dead code after always-throwing methods? @Andrew Tobilko 非常有道理。谢谢你:) 【参考方案1】:

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

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

【讨论】:

以上是关于代码中显然有一个无法访问的语句,但可以编译 - 为啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 会出现“无法访问的语句”编译器错误?

为啥 Java 编译器不会为无法访问的 then 语句生成无法访问的语句错误?

无法编译访问另一个 dll 的 dll

Java错误:创建新的链表节点时无法访问语句[关闭]

由于编译时计算的值,如何避免“无法访问的语句”?

如何在 C# 中使用 If DEBUG 语句而没有 IDE 认为代码无法访问?