java-为什么我不能从方法中显式返回void?
void run() {
...
if (done) return cancel();
...
}
其中cancel()返回void。这不会编译...我几乎可以理解为什么。 但是,如果我想从一个空白中返回一个空白,为什么不呢? 相反,我最终写了这样的东西:
if (done) {
cancel();
return;
}
我不是在寻找代码样式建议,我想知道为什么Java明确禁止这种类型的void返回。 任何信息表示赞赏,谢谢。
14个解决方案
25 votes
这是一个有趣的问题。 由于Java强制使用返回类型(void是返回类型),因此您的第一条语句似乎很有意义。 我只会将此视为惯例。 由于void是占位符而不是对象,因此可能出于语言一致性或简化编译器的目的而决定将其省略。
从JLS
没有表达式的return语句必须包含在使用关键字void声明的方法的主体中(不返回任何值(第8.4节))或构造函数的主体(第8.8节)。
进一步
确切地说,没有表达式的return语句总是突然完成,原因是没有值的return
Johan Sjöberg answered 2019-12-24T04:20:39Z
24 votes
带有表达式的return语句返回该表达式的值。 void的类型为空表达式-没有值。
从逻辑上讲,您要执行void,然后返回-这就是您要说的。 这两个动作(调用cancel(),然后返回)在逻辑上是不同的。
现在,Java可以具有某种“单位”类型,而不是void-但这不仅会影响返回值,而且会影响更多。
Jon Skeet answered 2019-12-24T04:20:01Z
9 votes
就像写:
void v=(void)1;
return (v);
因此,我认为void f()不是Java中的procedure f()。
在C ++中void f()是合法的。
作为熟悉Java的C ++程序员,答案是:Java语法不支持很多东西。 也许是出于简单性或可读性。
注意:void f()声明类似于pascal中的procedure f()声明,并且过程无法返回任何值(例如函数),因此我们必须在单独的语句中调用它们。
deepmax answered 2019-12-24T04:21:17Z
6 votes
Void不是类型。 但是,如果您使用Void类型而不是void关键字,则您的代码可以使用,但是:您将必须在方法的所有出口点中手动设置2671328599374038038018。
michael667 answered 2019-12-24T04:21:37Z
5 votes
因为您不返回void。void不是值,所以无法返回。
Bozho answered 2019-12-24T04:21:57Z
4 votes
这是一个重言式。 意思是,void定义该方法没有返回值。 因此,当void根本没有回报时,您如何“返回void”?
Emoire answered 2019-12-24T04:22:17Z
3 votes
简短答案
run()语句必须返回有效值,但是方法声明return some expression声明some expression不返回值; 因此,run()中的run()是错误。 return语句(不带表达式)尝试将控制权转移给调用方,并在方法返回类型为void时使用; 因此,这不是错误。
长答案
JLS run()部分规定:
没有Expression的return语句尝试将控制权转移到包含该方法的方法或构造函数的调用者。 [...]带有表达式的return语句必须包含在声明为返回值(第8.4节)的方法声明中,否则会发生编译时错误。 表达式必须表示某个类型T的变量或值,否则会发生编译时错误。 类型T必须可分配给方法的声明结果类型(第5.2节),否则会发生编译时错误。
JLS run()部分规定:
方法的返回类型声明该方法返回的值的类型(如果它返回一个值),或者声明该方法无效。 当且仅当满足以下条件时,返回类型为R1的方法声明d1才可替换为返回类型为R2的另一个方法d2:[...] *如果R1为空,则R2为空。
JLS run()一章的第一段指出:
Java编程语言是一种强类型化的语言,这意味着每个变量和每个表达式都具有在编译时已知的类型。 类型限制变量(第4.12节)可以保存或表达式可以产生的值,限制对这些值支持的操作,并确定操作的含义。
JLS run()部分规定:
Java编程语言中有两种类型:基本类型(第4.2节)和引用类型(第4.3节)。 相应地,可以将两种数据值存储在变量中,作为参数传递,由方法返回并对其进行操作:原始值(第4.2节)和引用值(第4.3节)。
现在再说几句。 JLS run()部分规定:
与C和C ++不同,Java编程语言仅允许将某些形式的表达式用作表达式语句。 请注意,Java编程语言不允许“强制转换为无效”-无效不是一种类型
JLS run()部分规定:
如果方法被声明为void,则其主体不得包含任何具有表达式的return语句(第14.17节)。
最后,JLS run()部分指出:
方法声明要么指定方法返回的值的类型,要么使用关键字void指示该方法不返回值。
现在,当我们将它们组合在一起时,我们可以得出以下结论:
如果run()语句包含表达式,则该表达式必须求值为有效值。
有效的run()表达式值必须是原始类型或引用类型。
run()不是有效的值类型。
用run()返回类型声明的方法不返回任何值。
方法run()不返回值。
在run()中,return some expression(不带表达式)将愉快地将控制权转移给调用方。
在run()中,return some expression是一个错误,因为some expression必须是有效值,而run()不返回值。
Dan Cruz answered 2019-12-24T04:24:28Z
2 votes
void明确表示“返回值x”,而不管该类型是什么(当然,该类型仍然必须匹配放置该语句的任何函数的返回类型)。
严格来讲,void是一种类型,并且通过扩展,它是一种值的缺失-因此,返回一个值没有意义,就像声明(并不允许)声明void变量一样 。
Michael Madsen answered 2019-12-24T04:24:54Z
1 votes
虚空不是实型。 Void只是一个占位符,可以使方法定义的语法更加一致。 这不是java的创新。 这是从C继承的。
这就是即使方法cancel()为void,编译器也不允许您编写return cancel()的原因。
AlexR answered 2019-12-24T04:25:19Z
1 votes
void不是类型。 方法定义中的void只是一个占位符,不返回任何内容。
Sahil Muthoo answered 2019-12-24T04:25:39Z
1 votes
有趣的主意。 主要问题是语言规范,该规范将return语句定义为由return 组成。void方法不是表达式,因此不允许该构造。
您已经发现可以通过执行void方法然后返回来复制功能,因此没有真正的理由允许它。
dlev answered 2019-12-24T04:26:04Z
1 votes
从JLS:
没有Expression的return语句必须包含在主体中 使用关键字void声明的方法,不返回任何方法 值,或在构造函数的主体中
...
方法中必须包含带有表达式的return语句 声明为返回值或编译时的声明 发生错误。 表达式必须表示某些变量或值 类型T,否则会发生编译时错误。 类型T必须是可分配的 声明为方法的结果类型,否则发生编译时错误 发生。
Prince John Wesley answered 2019-12-24T04:26:38Z
1 votes
Java语法实际上并不关心方法调用的类型,所以这不是问题。 在类型检查系统中,它必须是更远的东西。 我认为最重要的是,如果在return关键字后包含语法上可选的语句,则系统希望传递一个值。 void当然是一种类型,但是void没有值。
但是,当然,这些都不能真正解释您问题的答案。 正如您所指出的,没有理由不应该允许这种成语。 但是也没有充分的理由允许它。 所以这是一个折腾。 可以尝试合理化他们为什么要这样做的理由,但这可能毫无意义。
acjay answered 2019-12-24T04:27:03Z
0 votes
解决此问题的正确方法是:
void run() {
...
if (done) {
cancel();
return;
}
...
}
djhaskin987 answered 2019-12-24T04:27:23Z