一尘不染

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

java

我经常在调试程序时发现在代码块中插入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试图成为一个保姆,还是有充分的理由使它成为编译器错误?


阅读 1069

收藏
2020-03-13

共1个答案

一尘不染

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

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

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

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

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

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

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

2020-03-13