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

问题描述 投票:55回答:14
void run() {
    ...
    if (done) return cancel();
    ...
}

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

if (done) { cancel(); return; }
我不是在寻找代码样式建议,我想知道为什么Java明确禁止这种类型的void返回。任何信息表示赞赏,谢谢。
java void return-type
14个回答
24
投票
带有表达式的return语句返回该表达式的值。 cancel()的类型是一个无效表达式-它不是

have值。

逻辑上,您想执行cancel(),然后返回-这就是您要说的。这两个动作(分别调用cancel()和返回)在逻辑上是不同的。

现在Java

可以

具有某种"unit" type而不是void-但这不仅会影响返回值,而且会影响更多。

1
投票
some expression不是类型。方法定义中的run()只是一个占位符,不返回任何内容。

1
投票
有趣的想法。主要问题是语言规范,该规范将return语句定义为由return x组成。 void方法是

not


1
投票
从JLS:

1
投票
void实际上并不关心方法调用的类型,所以这不是问题。在类型检查系统中,它必须位于链的下游。我认为最重要的是,在return关键字之后包含

if


0
投票

25
投票
这是一个有趣的问题。由于Java强制使用返回类型(void是返回类型),因此您的第一条语句似乎很有意义。我只会将此视为惯例。由于void是占位符而不是对象,因此可能出于语言一致性或简化编译器的目的而决定将其省略。

来自JLS

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

进一步

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

9
投票
就像写:

void v = (void) 1; return (v);

所以,我认为Java中的void不是type。在C ++中,return cancel();是合法的。作为熟悉Java的C ++程序员,答案是:Java语法不支持许多功能。也许是出于简单性或可读性。

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


7
投票
void不是类型。但是,如果您使用Void类型而不是Void关键字,则您的代码将起作用,但是:您将必须手动在方法的所有出口点中使用void

5
投票
因为您不

返回 return nullvoid不是值,因此无法返回。


4
投票
这是一个重言式。意思是,void定义该方法没有返回值。因此,当void根本没有回报时,您如何“返回void”?

3
投票
简短回答

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

详细回答

void JLS状态:

不带表达式的return语句尝试将控制权转移给包含它的方法或构造函数的调用者。 [...]带有表达式的return语句必须包含在声明为返回值(第8.4节)的方法声明中,否则会发生编译时错误。表达式必须表示某个类型T的变量或值,否则会发生编译时错误。类型T必须可分配给方法的声明结果类型(第5.2节),否则会发生编译时错误。

JLS The *return* Statement section状态:

方法的返回类型声明了方法返回的值的类型(如果它返回一个值),或者声明该方法无效。具有且仅当以下条件成立时,具有返回类型R1的方法声明d1可替换具有返回类型R2的另一方法d2:[...] *如果R1为空,则R2为空。]

[JLS The *return* Statement,第一段指出:

Java编程语言是一种强类型语言,这意味着每个变量和每个表达式都具有在编译时已知的类型。类型限制变量(第4.12节)可以持有或表达式可以产生的值,限制对这些值支持的操作,并确定操作的含义。

JLS Method Return Type section状态:

Java编程语言中有两种类型:基本类型(第4.2节)和引用类型(第4.3节)。相应地,可以将两种数据值存储在变量中,作为参数传递,由方法返回并对其进行操作:原始值(第4.2节)和引用值(第4.3节)。

现在只需再引用几句话。 JLS Method Return Type状态:

与C和C ++不同,Java编程语言仅允许将某些形式的表达式用作表达式语句。请注意,Java编程语言不允许“强制转换为无效” -void不是类型

JLS Types, Values, and Variables chapter状态:

如果方法被声明为空,则其主体不得包含任何具有表达式的返回语句(第14.17节)。

最后,JLS Types, Values, and Variables声明:

方法声明要么指定该方法返回的值的类型,要么使用关键字void指示该方法不返回值。

现在,当我们将它们拼凑在一起时,我们可以推断出以下内容:

    如果The Kinds of Types and Values section语句包含表达式,则该表达式必须计算为有效值。
  • 有效的The Kinds of Types and Values表达式值必须是原始类型或引用类型。
  • Expression Statements section不是有效的值类型。
  • Expression Statements返回类型声明的方法,不返回值。
  • 方法Method Body section不返回值。
  • Method Body中,Method Declarations section,不带表达式,将愉快地将控制权转移给调用者。
  • Method Declarations中,return是错误,因为return必须是有效值,并且void不返回值。

2
投票
[void明确表示“返回值x”,无论该类型是什么(当然,该类型仍必须与放置该语句的任何函数的返回类型相匹配)。]

1
投票
无效不是实型。 Void只是一个占位符,可以使方法定义的语法更加一致。这不是java的创新。这是从C继承的。

这是即使方法returnrun(),编译器也不允许您编写return some expression的原因。

© www.soinside.com 2019 - 2024. All rights reserved.