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

标签 java c# oop

我遇到了一种情况,即 non-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 和 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(); 
}

这是一个非 void 方法。为了满足接口(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/16789832/

相关文章:

java - 如何在适配器 onBind() 中比较 2 个具有不同元素集的列表?

java - 是否可以绑定(bind)嵌套泛型?

Java:构造函数参数( double 类型)始终为 0

java - java中实现大量具有相似签名的方法的最佳设计模式是什么?

c# - 在 C# 中格式化属性的 Resharper 支持字段

c# - 将纬度和经度转换为 double 值的最简单方法是什么

c# - Azure 代理,请求 IIS 托管 API 时出现 CORS 错误

java - 工厂方法模式是模板方法模式的特例吗?

java - 对 Java OOP 理论有一些澄清吗?

java - 无法关闭输出流