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

标签 java c# oop

我遇到了这样一种情况:非 void 方法 缺少 return 语句,代码仍然可以编译。 我知道 while 循环之后的语句是 unreachable (死代码)并且永远不会被执行。但是为什么编译器甚至不警告返回的东西呢?或者为什么一种语言允许我们拥有一个具有无限循环且不返回任何内容的非 void 方法?

public int doNotReturnAnything() {
    while(true) {
        //do something
    }
    //no return statement
}

如果我在 while 循环中添加 break 语句(即使是条件语句),编译器会提示臭名昭著的错误:Method does not return a value in Eclipse and Not all code路径在 Visual Studio 中返回一个值

public int doNotReturnAnything() {
    while(true) {
        if(mustReturn) break;
        //do something
    }
    //no return statement
}

Java 和 C# 都是如此。

最佳答案

Why would a language allow us to have a non-void method having an infinite loop and not returning anything?

非 void 方法的规则是每个返回的代码路径都必须返回一个值,并且您的程序满足该规则:返回的零个代码路径确实返回一个值。规则不是“每个非 void 方法都必须有一个返回的代码路径”。

这使您能够编写 stub 方法,例如:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    throw new NotImplementedException(); 
}

这是一个非空方法。它必须是非空方法才能满足接口(interface)。但是使这个实现非法似乎很愚蠢,因为它不返回任何东西。

由于 goto,您的方法有一个无法到达的终点(请记住,while(true) 只是编写 goto< 的一种更愉快的方式) 而不是 throw(这是 goto 的另一种形式)是不相关的。

Why doesn't the compiler even warn about returning something?

因为编译器没有很好的证据表明代码是错误的。有人写了 while(true) ,似乎做那件事的人知道他们在做什么。

Where can I read more about reachability analysis in C#?

在此处查看我关于该主题的文章:

ATBG: de facto and de jure reachability

您还可以考虑阅读 C# 规范。

关于java - 非 void 方法中缺少 return 语句编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37425349/

相关文章:

C# UDP Socket 不监听响应?

c# - 当 HashSet<T> 作为对象提供并且 T 可以是任何东西时,如何循环遍历它?

c# - 如何使用数据绑定(bind)正确更改 WPF 中控件的状态?

java - 为什么我收到此错误 : data structures (arrays)?

java - collections.sort(list, comparator) 使用比较器 DEBUG

java - Thread.start() 和 Thread.run() 有什么区别?

c# unity2D 处理多个背景

java - 这是什么奇特之处?为什么我应该选择像访客设计模式这样的双重调度解决方案?

python - 装饰器可以访问类的私有(private)成员吗?

java - 如何设计日历