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;
}
...
}