当前位置: 首页 > 面试题库 >

无法到达的代码编译器错误

郭阳曜
2023-03-14
问题内容

以下代码给出了unreachable statement编译器错误

public static void main(String[] args) {
    return;
    System.out.println("unreachable");
}

有时出于测试目的,希望防止某个方法被调用,因此一种快速执行此方法(而不是在使用
该方法的位置处将其注释掉)的方法是立即从该方法返回,以便该方法不执行任何操作。然后,我总是做些什么来解决编译器错误,这是

public static void main(String[] args) {
    if (true) {
        return;
    }
    System.out.println("unreachable");
}

我很好奇,为什么会出现编译器错误?它会以某种方式破坏Java字节码,是为了保护程序员还是其他?

同样(这对我来说更有趣),如果将Java编译为字节码可以进行任何类型的优化(甚至没有这样做),那么为什么
在第二个示例中它为什么不能检测到公然的无法访问的代码呢?检查语句是否不可访问的编译器伪代码是什么?


问题答案:

无法访问的代码毫无意义,因此编译时错误会有所帮助。如您所料,在第二个示例中不会检测到它的原因是出于
测试/调试的目的。在规范中对此进行了解释:

if (false) { x=3; }

不会导致编译时错误。优化的编译器可能会意识到
语句x = 3; 永远不会执行,可以选择
从生成的类文件中省略该语句的代码,但是语句
x = 3; 从此处指定的技术意义上讲,它不被视为“无法到达”。

这种不同处理的基本原理是允许程序员定义
“标志变量”,例如:

static final boolean DEBUG = false;

and then write code such as:

if (DEBUG) { x=3; }

这个想法是应该可以将DEBUG的值从
false 更改为true或从true更改为false,然后正确编译代码,而
无需对程序文本进行其他更改。
Reference:
http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.21



 类似资料:
  • 问题内容: 作为建议在这里,我已成功安装了微软的Visual C ++编译器为Python 2.7 编译一些用Cython代码,但是: 仍然产生: 错误:找不到vcvarsall.bat 如何使用Python 2.7编译Cython代码(例如在Windows 7 x64上)? 注意:我已经仔细阅读了以下错误问题:找不到vcvarsall.bat,但是主要答案(包括修改)都无法解决。 问题答案: 我

  • 问题内容: 第14行发生了错误。 线程“主”中的异常java.lang.RuntimeException:无法编译的源代码-错误的sym类型: 很难找到解决方案。 问题答案: 您提供的代码在我的计算机上运行良好。 我猜您正在使用Netbeans,并且可能会受到错误的影响。试试这个: 打开项目属性,选择Build-Compiling,取消选中“保存时编译”,然后重新运行应用程序。这样可以确保在运行之

  • 我最近在部署到我们的共享主机时遇到了问题。从 Visual Studio 通过 Web 部署进行部署时,99% 的时间我在登录后在登录页面或主页上收到此错误。有时我可能会点击几下不同的部分,然后它就会击中。它通常会在几分钟到90分钟后消失。 运行Windows Server 2012 R2 Standard、IIS8和.NET 4.5的Web主机。 Web主机建议我需要使用Visual Studi

  • 我当前正在获取和生成失败的错误。尝试卸载android Studio,卸载并重新安装java,但无效。谢谢你的建议。非常感谢。 失败:生成失败,出现异常。 > 出了什么问题:任务执行失败:app: greendao。 <区块报价> 在解析/xxx/android/app/src/main/java/com/eatsy/打印机/Printer.java时发现4个问题。第一个问题:Pb(324)无法解

  • 问题内容: 我经常在调试程序时发现在代码块中插入return语句很方便(尽管可能是不好的做法)。我可能会在Java中尝试类似的方法.... 当然,这会产生编译器错误。 Test.java:7:无法访问的语句 我能理解为什么警告是合理的,因为有未使用的代码是不好的做法。但是我不明白为什么这需要产生一个错误。 这只是Java试图成为一个保姆,还是有充分的理由使它成为编译器错误? 问题答案: 因为无法到