为什么我不能从方法中显式返回void?

Tra*_*ebb 55 java return-type void

void run() {
    ...
    if (done) return cancel();
    ...
}
Run Code Online (Sandbox Code Playgroud)

哪里cancel()回来void.这不会编译......我几乎可以理解为什么.但是如果我想从虚空中归还一个空洞,为什么不呢?相反,我最终写了这样的东西:

if (done) {
    cancel();
    return;
}
Run Code Online (Sandbox Code Playgroud)

我不是在寻找代码风格的建议,我想知道为什么Java明确禁止这种类型的void返回.任何信息表示赞赏,谢谢.

Joh*_*erg 25

这是一个有趣的问题.由于java强制执行返回类型(void是一种返回类型),因此您的第一个语句似乎有意义.我认为这只是为了惯例.由于void是一个占位符而不是一个对象,因此可能决定将其排除在语言一致性或编译器简单性之外.

来自JLS

没有Expression的return语句必须包含在声明的方法体中,使用关键字void,不返回任何值(第8.4节),或者包含在构造函数体(第8.8节)中.

进一步

确切地说,没有表达式的return语句总是突然完成,原因是没有值的返回


Jon*_*eet 24

带有表达式的return语句返回该表达式的值.的类型的cancel()是空隙表达-它不具有一个值.

从逻辑上讲,你想要执行cancel(),然后返回 - 这就是你要说的.这两个动作(调用cancel()然后返回)在逻辑上是不同的.

现在Java 可能有一种"单元"类型而不是void- 但这会影响返回值.

  • @ michael667但是Void并非无效.返回void的接口无法通过返回java.lang.Void的方法实现.java.lang.Void仅用于处理Reflection和Generics中的void. (3认同)

mas*_*oud 9

这就像写作:

void v=(void)1; 
return (v);
Run Code Online (Sandbox Code Playgroud)

所以,我认为void不是typeJava.

在C++中,return cancel();是合法的.

作为熟悉Java的C++程序员,答案是:Java语法中不支持很多东西.也许是为了简单或可读性.

注意:void f()声明类似于procedure f()pascal中的声明,并且过程不能返回任何值,例如函数,因此我们必须在单独的语句中调用它们.


mic*_*667 7

void不是一种类型.但是,如果使用Void类型而不是void关键字,则代码将起作用,但是:您将手动return null从方法的所有退出点开始.

  • 是的,但它变成了高度非惯用的Java代码,IMO. (5认同)

Boz*_*zho 5

因为你没有回来 void.void不是值,因此无法返回.