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

Java为什么会有“无法到达的语句”编译器错误?

傅正阳
2023-03-14
问题内容

我经常在调试程序时发现在代码块中插入return语句很方便(尽管可能是不好的做法)。我可能会在Java中尝试类似的方法....

class Test {
        public static void main(String args[]) {
                System.out.println("hello world");
                return;
                System.out.println("i think this line might cause a problem");
        }
}

当然,这会产生编译器错误。

Test.java:7:无法访问的语句

我能理解为什么警告是合理的,因为有未使用的代码是不好的做法。但是我不明白为什么这需要产生一个错误。

这只是Java试图成为一个保姆,还是有充分的理由使它成为编译器错误?


问题答案:

因为无法到达的代码对编译器毫无意义。尽管使代码对人有意义不仅比使代码对编译器有意义更困难,但编译器是代码的基本使用者。Java的设计者认为对编译器没有意义的代码是错误。他们的立场是,如果你有一些无法访问的代码,那么你犯了一个错误,需要修复。

这里有一个类似的问题:无法访问的代码:错误还是警告?,其中作者说:“我个人强烈认为这应该是一个错误:如果程序员编写一段代码,那么在某些情况下应该始终实际运行它。” 显然,Java的语言设计师对此表示赞同。

无法访问的代码是否应该阻止编译是一个永远不会达成共识的问题。但这就是Java设计人员这样做的原因。

有很多评论的人指出,Java无法阻止编译的代码种类很多。如果我正确理解了Gödel的后果,那么没有编译器可以捕获所有无法访问的代码类。

单元测试无法捕获每个错误。我们不以此为理由反对它们的价值。同样,编译器无法捕获所有有问题的代码,但是对于编译器而言,它可以防止编译错误代码,这仍然很有价值。

Java语言设计人员将无法访问的代码视为错误。因此,在可能的情况下防止其编译是合理的。

(在否决票之前:问题不是Java是否应具有不可到达的语句编译器错误。问题是Java 为什么会有不可达的语句编译器错误。请不要仅仅因为你认为Java做出了错误的设计决定就对我进行否决。)



 类似资料:
  • 问题内容: 当我尝试编译该程序时,在第21行出现“无法到达的语句”错误: 完整的编译器输出为: 我 认为 这些语句在正确的地方…至少在我看来似乎是正确的,并且与我从中克隆的程序相比,该程序看起来是如此简单,以至于我很难确定为什么要这样做。语句无法到达。 复制代码时我做错了什么,我该如何纠正? 问题答案: 您以为您的问题在这里是对的: 该函数将 终止 您的方法,这意味着将不执行任何超出代码的行。如果

  • 如果我尝试编译 Java编译器会产生一个错误,说。但是如果我添加另一个“unreacable”(根据我的说法)语句并使其: 它可以编译。为什么不产生错误?

  • 问题内容: 以下代码给出了编译器错误 有时出于测试目的,希望防止某个方法被调用,因此一种快速执行此方法(而不是在使用 该方法的位置处将其注释掉)的方法是立即从该方法返回,以便该方法不执行任何操作。然后,我总是做些什么来解决编译器错误,这是 我很好奇,为什么会出现编译器错误?它会以某种方式破坏Java字节码,是为了保护程序员还是其他? 同样(这对我来说更有趣),如果将Java编译为字节码可以进行任何

  • 对于我的Java类,要求我们在working For语句中添加分号,并解释为什么输出是这样的。我不明白为什么添加分号会产生错误的树类型错误,导致代码无法编译。代码下面是输出;我还向any标记添加了反斜杠,因为它不会以其他方式显示。那么,为什么for语句后面的分号会导致这样的错误呢?提前谢谢。 运行时间:

  • 问题内容: 是否有可能以某种方式忽略此错误?我发现将自己不想运行的代码放在前面比注释它要容易得多(当注释重叠并且表现不佳时)… 问题答案: 否。这是编译时错误。因此,在运行课程之前,您 必须 摆脱它。 我通常要做的是在其前面放置一个虚假陈述。就像是: 使用此代码,您将不会出错。您将得到想要的东西。

  • 所以我得到了一个编译器错误,我丢失了一个返回语句,我已经研究了其他类似的问题,但我仍然对这个问题感到困惑。 如果之前有人问过这个问题,我会提前道歉,但我已经看过了其他各种问题,我似乎无法弄清楚这一点。