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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值