Java 为什么可以';我是否从方法显式返回void?

Java 为什么可以';我是否从方法显式返回void?,java,void,return-type,Java,Void,Return Type,其中cancel()返回void。这不会编译。。。我几乎能理解为什么。但是如果我想从一个空中返回一个空,为什么不呢?相反,我最终写了这样的东西: void run() { ... if (done) return cancel(); ... } 我不是在寻找代码风格的建议,我想知道为什么Java明确禁止这种类型的void返回。非常感谢您提供的任何信息。因为您不会返回voidvoid不是值,因此无法返回。void不是实类型。Void只是一个占位符,使方法定义的语法更加一致

其中
cancel()
返回
void
。这不会编译。。。我几乎能理解为什么。但是如果我想从一个空中返回一个空,为什么不呢?相反,我最终写了这样的东西:

void run() {
    ...
    if (done) return cancel();
    ...
}

我不是在寻找代码风格的建议,我想知道为什么Java明确禁止这种类型的void返回。非常感谢您提供的任何信息。

因为您不会返回
void
void
不是值,因此无法返回。

void不是实类型。Void只是一个占位符,使方法定义的语法更加一致。这不是java的创新;这是从C继承的


这就是为什么编译器不允许您编写
return cancel()
,即使方法
cancel()
void
,这是一个有趣的问题。由于java强制执行一个返回类型(
void
是一个返回类型),所以您的第一条语句似乎是有意义的。我只会把这个当作惯例。由于
void
是一个占位符,而不是一个对象,因此出于语言一致性或编译器简单性的考虑,可能决定将其省略

不带表达式的return语句必须包含在使用关键字void声明的方法体中,以不返回任何值(§8.4),或包含在构造函数体中(§8.8)

进一步

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


void
不是一种类型<方法定义中的code>void只是一个不返回任何内容的占位符。

return x
明确表示“返回值x”,无论该类型是什么(当然,该类型仍必须与该语句所在的任何函数的返回类型相匹配)


严格来说,
void
是没有类型,也就是没有值——因此返回一个值是没有意义的,就像声明
void
变量是没有意义的(而且是不允许的)。

带有表达式的返回语句返回该表达式的值。
cancel()
的类型是一个空表达式-它没有值

从逻辑上讲,您希望执行
cancel()
,然后返回-这就是您要说的。这两个操作(调用
cancel()
然后返回)在逻辑上是不同的


现在Java可以有一种代替void的类型,但这不仅仅影响返回值。

void
不是一种类型。但是,如果您使用类型而不是
void
关键字,您的代码将正常工作,但是:您必须在方法的所有退出点中手动
返回null

有趣的想法。主要问题是语言规范,它将return语句定义为由
return
组成。void方法不是表达式,因此不允许构造

您发现可以通过执行void方法然后返回来复制功能,因此没有真正的理由允许它。

来自JLS:

不带表达式的return语句必须包含在 使用关键字void声明的方法,不返回任何 值,或在构造函数的主体中


方法中必须包含带有表达式的返回语句 声明以返回值或编译时的声明 发生错误。表达式必须表示某个变量或值 输入T,否则会发生编译时错误。类型T必须是可赋值的 方法的声明结果类型,或编译时错误 发生

就像在写:

if (done) {
    cancel();
    return;
}
因此,我认为
void
在Java中不是
类型。在C++中,<代码>返回取消();<代码>是合法的。作为熟悉java的C++程序员,答案是:java语法中不支持很多东西。也许是为了简单或易读


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

这是一个重言式。也就是说,void定义该方法没有返回值。所以,当void根本不返回时,你怎么能“返回void”

实际上并不关心方法调用的类型,所以这不是问题所在。它必须是更深层的东西,在类型检查系统中。我认为底线是,如果return关键字后面包含语法上可选的语句,那么系统希望传递一个值
void
当然是一个类型,但是没有类型为
void
的值

但是,当然,这些都不能真正解释你问题的答案。正如你所指出的,没有理由不允许使用这个成语。但也没有正当理由允许这样做。所以这是一个折腾。人们可以试着为他们为什么这么做找理由,但那可能是毫无意义的。

简短回答
return cancel()
语句必须返回有效值,但方法声明
void run()
声明
run()
不返回值;因此,
run()
中的
return cancel()
是一个错误。
return
语句(不带表达式)尝试将控制权转移给调用方,并在方法返回类型为
void
时使用;因此,这不是一个错误

长话短说 各国:

不带表达式的return语句尝试将控制传递给包含它的方法或构造函数的调用方。[…]带有表达式的return语句必须包含在声明为返回值(§8.4)的方法声明中,否则会发生编译时错误。E
void v = (void) 1;
return (v);
void run() {
...
if (done) {
    cancel();
    return;
    }
...
}