English 中文(简体)
为什么我能明确地从某种方法中恢复真空?
原标题:Why can t I explicitly return void from a method?
void run() {
    ...
    if (done) return cancel();
    ...
}

www.un.org/chinese/ga/president 这赢得了编集......我可以几乎<>/em>理解原因。 但是,如果我希望从一个真空中恢复一个空白,为什么不呢? 相反,我最后写道:

if (done) {
    cancel();
    return;
}

我不想看法风格的建议,我想知道,为什么 Java明禁止这种无效的返回。 感谢。

最佳回答

附有表述的返回声明重申了这一表述的价值。 <代码>cancel()的类型是无效的表述,它有t have/em> a Value。

顺便说一句,你希望执行<代码>cancel(),然后回去——这样你必须说。 这两项行动(cancel(>,然后返回)在逻辑上是不同的。

Now >“unit” 类型,而不是, 避免,但这不仅会影响回报价值。

问题回答

这是一个令人感兴趣的问题。 由于java强制实行一种回归类型(void/code>为一种回报类型),你的第一次发言似乎具有意义。 我只考虑公约。 由于<条码>撤销是一个地方持有人,而不是一个标的,因此可能决定将其删除,使之不必使用语文的同义词或编纂者作简化。

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.17“rel=“noreferer”>JLS

不得作任何表述的返回声明必须载于采用关键词句宣布的方法的正文中,不得退还任何价值(第8.4段),或放在建筑商身上(第8.8段)。

进一步

To be precise, a return statement with no Expression always completes abruptly, the reason being a return with no value

它像书面一样:

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

因此,我想void/code>不是 Java的type。 在C++中,return核销(>);为合法。 作为熟悉 Java的C++方案制定者,答案是:在 Java辛没有支持很多东西。 或许可以简单或易读。

Note: A Without f() declaration is similar to a procedure f( declaration in pascal and a procedure could not re any Value such as functions, so we must calls in a separate statement.

由于您没有t return> , 即:

It s a tautology. Meaning, void defines that the method has no return value. Therefore, how can you "return void" when void is no return at all?

Short Answer

The return cancel() statement must return a valid value, but the method declaration void run() declares that run() does not return a value; hence, return cancel() in run() is an error. The return statement (without an expression) attempts to transfer control to the caller and is used when the method return type is void; hence, not an error.

Long Answer

rel=“nofollow”>JLS ∗return * 声明 国家:

A return statement with no Expression attempts to transfer control to the invoker of the method or constructor that contains it. [...] A return statement with an Expression must be contained in a method declaration that is declared to return a value (§8.4) or a compile-time error occurs. The Expression must denote a variable or value of some type T, or a compile-time error occurs. The type T must be assignable (§5.2) to the declared result type of the method, or a compile-time error occurs.

The JLS Method型回归/code> section 国家:

一种方法的回报类型宣布,如果方法回报价值,其价值类型即为无效。 如果并且只有在以下条件允许的情况下,R1号回归类型R1即为另一种回归类型R2的方法的回归类型替代物:[......]R1无效,R2无效。

The JLS Types, Values, and Variables chapter, first paragraph states:

Java节目使用的语言是很强的类型,这意味着每个变数和每个表达方式都有汇编时已知的类型。 类型限制变数(第412段)可以持有的或表达能够产生的价值,限制这些价值支持的行动,并确定行动的含义。

The JLS The Kinds of Natures and Values:

Java方案拟订语言有两种类型:原始类型(第4.2节)和参考类型(第4.3节)。 相应地,可以储存在变数中的两种数据值,作为论据,通过方法回馈,并按原始价值(第4.2段)和参考价值(第4.3段)操作。

现在仅举几个例子。 缩略语: 国家:

与C和C++不同的是, Java方案语言只允许某些形式的表述作为表述。 注: Java方案措辞不允许“更改为无效”即不属于类型

The JLS Method Body section 国家:

如果一种方法被宣布无效,则其身体不得包含任何带有表述的返回声明(第14.17条)。

最后,JLS Method Declarations 国家:

一种方法声明要么具体规定了方法回报的价值类型,要么使用关键词表示该方法不退还价值。

现在,当我们齐心协力,我们就能够提出以下几点:

  • If a return statement contains an expression, the expression must evaluate to a valid value.
  • A valid return expression value must be a primitive type or a reference type.
  • void is not a valid value type.
  • A method declared with a void return type, returns no value.
  • Method void run() does not return a value.
  • In run(), return, without an expression, will happily transfer control to the caller.
  • In run(), return some expression is an error because some expression must be a valid value and run() does not return a value.

<代码>return x系指“退还价值x”,而不论这种类型如何(当然,这种类型仍须与所说明的任何功能的返回类型相称)。

投票不是真正的。 选民只是一个地方持有人,使方法定义的辛迪加更加一致。 这并不是 j的革新,而是从C继承的。

因此,即使方法<代码>cancel(<><>>> 代码/代码>为<代码>,汇编者也不允许你写上<代码>return核销(>。

。 <代码> 删除在方法定义中仅是无收益的持有人。

有趣的想法。 主要问题是语言光谱,它把返回声明定义为由<代码>return <expression>组成。 无效方法为not一种表述,因此该建筑是允许的。

阁下发现,你可以通过执行无效方法复制功能,然后返回,因此没有真正的理由允许这种功能。

摘自JLS:

A return statement with no Expression must be contained in the body of a method that is declared, using the keyword void, not to return any value, or in the body of a constructor

......

A return statement with an Expression must be contained in a method declaration that is declared to return a value or a compile-time error occurs. The Expression must denote a variable or value of some type T, or a compile-time error occurs. The type T must be assignable to the declared result type of the method, or a compile-time error occurs.

http://java.sun.com/docs/books/jls/first_edition/html/19.doc.html” rel=“nofollow” Java grammar实际上不关心某种方法的类型,从而不解决问题。 在分类检查系统中,它必须比链条更远。 我认为,底线是:if在交回关键词之后列入书面选修声明,然后该系统预计会有价值。 a 类型,但无“<> 代码”的数值。

当然,这当然没有真正解释对你的问题的回答。 正如你指出的那样,没有理由不允许这种区别。 但没有理由允许这样做。 因此,它 to了。 人们可以设法合理解释为什么他们做了些什么,但这可能是毫无意义的。

解决这一问题的适当途径是:

void run() {
...
if (done) {
    cancel();
    return;
    }
...
}




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签