当前位置: 首页 > 知识库问答 >
问题:

非void方法编译中缺少return语句

萧芷阳
2023-03-14

我遇到一种情况,一个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#都是如此。

共有2个答案

上官波鸿
2023-03-14

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只能计算为truefalse,因此不需要在if-else之后显式地提供return,因为该代码是不可达的,Java对此并不抱怨。

傅兴平
2023-03-14

为什么一种语言允许我们有一个非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语句并且我的代码正确地关闭了括号。请帮忙,谢谢