【发布时间】:2013-05-23 07:02:31
【问题描述】:
我遇到了一种情况,即 non-void 方法 缺少 return 语句并且代码仍然可以编译。 我知道 while 循环之后的语句是 unreachable (死代码)并且永远不会被执行。但是为什么编译器甚至不警告返回一些东西呢?或者为什么一种语言允许我们拥有一个具有无限循环并且不返回任何内容的非 void 方法?
public int doNotReturnAnything() {
while(true) {
//do something
}
//no return statement
}
如果我在 while 循环中添加 break 语句(甚至是条件语句),编译器会抱怨臭名昭著的错误:Eclipse 中的 Method does not return a value 和 Visual Studio 中的 Not all code paths return a value。
public int doNotReturnAnything() {
while(true) {
if(mustReturn) break;
//do something
}
//no return statement
}
Java 和 C# 都是如此。
【问题讨论】:
-
好问题。我会对此原因感兴趣。
-
一个猜测:它是一个无限循环,所以返回控制流无关紧要?
-
“为什么一种语言允许我们拥有一个具有无限循环且不返回任何内容的非 void 方法?”
-
对于Java,你可以在this answer找到一个很好的解释。
-
就像其他人解释的那样,这是因为编译器足够聪明,知道循环是无限的。请注意,尽管编译器不仅允许缺少返回,它强制它,因为它知道循环无法访问之后的任何内容。至少在 Netbeans 中,如果在循环之后有 anything,它实际上会抱怨
unreachable statement。