我不介意我不理解,但我想知道为什么会这样:
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方法的结果时,为什么代码不能编译?
答案 0 :(得分:4)
这在JLS 14.17:
中定义带有Expression的return语句必须包含在下列之一中,否则会发生编译时错误:
- 声明为返回值的方法
- 一个lambda表达式
未声明void
方法返回值,因此在这样的方法中不能发生带有表达式的返回语句(如函数调用)。
此外,由于JLS 15.12.3中的此语言,您无法返回void
方法的结果:
如果编译时声明为
void
,则方法调用必须是顶级表达式(即表达式语句或 ForInit中的 Expression 或 ForUpdatefor
语句的一部分),或发生编译时错误。
换句话说,由于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.
您无法更改语言规则!