我遇到一种情况,一个non-void方法缺少一个return语句,而代码仍然在编译。我知道while循环之后的语句是不可达的(死代码),并且永远不会被执行。但是为什么编译器甚至不警告返回一些东西呢?或者为什么一种语言允许我们有一个非void的方法,它有一个无限循环,而不返回任何东西?
public int doNotReturnAnything() {
while(true) {
//do something
}
//no return statement
}
如果我在while循环中添加一个break语句(即使是一个条件语句),编译器就会抱怨那些臭名昭著的错误:在Eclipse中方法不返回值
,在Visual Studio中不是所有代码路径都返回值
。
public int doNotReturnAnything() {
while(true) {
if(mustReturn) break;
//do something
}
//no return statement
}
Java和C#都是如此。
Java编译器足够聪明,可以找到无法到达的代码(while
循环之后的代码)
而且由于它是不可达的,所以在那里添加return
语句(在while
结束之后)是没有意义的
条件if
也是如此
public int get() {
if(someBoolean) {
return 10;
}
else {
return 5;
}
// there is no need of say, return 11 here;
}
由于布尔条件someBoolean
只能计算为true
或false
,因此不需要在if-else
之后显式地提供return
,因为该代码是不可达的,Java对此并不抱怨。
为什么一种语言允许我们有一个非void的方法,它有一个无限循环,而不返回任何东西呢?
非void方法的规则是每个返回的代码路径都必须返回一个值,并且在您的程序中满足这个规则:返回的零个代码路径中有零个返回一个值。规则不是“每个non-void方法必须有一个返回的代码路径”。
这使您能够编写存根方法,如:
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
那是一种非空方法。它必须是一个非空的方法,以满足接口。但是因为这个实现不返回任何东西而使它成为非法的似乎是愚蠢的。
由于goto
(记住,while(true)
只是编写goto
的一种更愉快的方式)而不是throw
(这是goto
)的另一种形式),所以您的方法具有不可达的终点,这一点是不相关的。
为什么编译器甚至不警告返回一些东西?
因为编译器没有很好的证据证明代码是错误的。有人写了while(true)
,这样做的人似乎知道他们在做什么。
在哪里可以读到关于C#中可达性分析的更多信息?
请参阅我在此主题上的文章:
ATBG:事实上和法律上的可达性
您还可以考虑阅读C#规范。
此ProductDAO类返回用户的产品列表,但Netbeans中的编译器显示“Missing return statement”。有进展吗?
我一直得到一个丢失的返回语句错误,但我不知道在哪里。每次跟随代码,我都感觉到至少有一个if语句提供了return语句。 代码:
关于或语句中使用的return语句,我有一个问题。正如您在下面的方法中所看到的,希望I一个字符串值。问题是,如果在语句块中使用语句,编译器将返回错误。 当然,我可以将方法头更改为,并使用而不是。但这是正确的做法吗?我是不是漏掉了什么? 任何帮助都是非常感谢的。
我有以下代码 null 我错过了什么?
我不断地得到缺少的return语句并且在解析时到达文件的结尾,然而我已经有了return语句并且我的代码正确地关闭了括号。请帮忙,谢谢