void方法不能返回void方法的值?

时间:2015-07-14 15:16:16

标签: java return void

我不介意我不理解,但我想知道为什么会这样:

void something(String a) {
    return hi();
}
void hi() {
    return;
}

这里奇怪的是,hi()的返回类型为void。我在IDE中遇到语法错误:

Void methods cannot return a value

此外,代码无法编译:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Void methods cannot return a value

    at Resources.setSystemProperties(Resources.java:33)
    at Resources.main(Resources.java:49)

我希望这会发生:

hi() -> return nothing

return [nothing] -> hi() is nothing

所以最后,它什么都不返回,就像void方法一样。

为什么会出现这种情况?当返回void方法的结果时,为什么代码不能编译?

5 个答案:

答案 0 :(得分:4)

这在JLS 14.17

中定义
  

带有Expression的return语句必须包含在下列之一中,否则会发生编译时错误:

     
      
  • 声明为返回值的方法
  •   
  • 一个lambda表达式
  •   

未声明void方法返回值,因此在这样的方法中不能发生带有表达式的返回语句(如函数调用)。

此外,由于JLS 15.12.3中的此语言,您无法返回void方法的结果:

  

如果编译时声明为void,则方法调用必须是顶级表达式(即表达式语句或 ForInit中的 Expression ForUpdate for语句的一部分),或发生编译时错误。

换句话说,由于a.notify()void,你可以在它看起来像一个语句的上下文中使用它(即,所有单独在一行上),但不能在它看起来像一个上下文的上下文中使用它表达式(即,您不能将其值赋给变量,返回它等)。

答案 1 :(得分:2)

声明为void的函数不能return任何东西,就像错误所说的那样。你假设a.notify()返回任何东西都是假的,因为a.notify()也不能返回任何东西(因为它是无效的)。

答案 2 :(得分:2)

因为这就是语言的运作方式。您不能使用return关键字在返回类型为void的方法中返回值。 void is not a real value that can be passed around

  

Void类是一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。

此处an article by James Iry comparing void in Java with Unit in Scala。 (与void不同,unit是一个可以返回的实际值。)他演示了使用Unit类型而不是void的优点:

  

Java,C ++和C#程序员确实一直在解决这个问题。一个常见的选择是不使用Function,而是使用其他一些概念,如" Action"表示接受字符串的函数,执行副作用,并且不返回任何有用的函数。然后你基本上复制" map"进入一个叫做'#fore;"期望一个Action并返回void。在这种情况下,这可能是有意义的,因为对无意义值的引用列表可能是愚蠢的,但如果这种高阶编程很常见,它也意味着大量的代码重复。例如,你不能只编写一个从另外两个函数创建函数的compose函数,你还必须编写一个使用动作和函数来创建动作的compose。

答案 3 :(得分:0)

Java编译器不会那么深入。当它在void函数中看到返回关键字后面带有一些值时会抛出编译错误。这是编程的。就如此容易。

答案 4 :(得分:0)

return  statements simply cannot be used with `Void` as it's Return type.

您无法更改语言规则!