在Java中,return语句可以出现在哪些位置?

3
除了在方法/构造函数体内,还有其他地方吗?
此外,构造函数能返回什么吗?或者我只能使用“return;”而没有任何表达式跟随它吗?

你正在做什么工作?你问了一些奇怪的“语言法律”问题,这让我很好奇 :-) - Pointy
因为我前几天误解了一个问题,所以我不会再被诱导回答另一个问题。 :) - biziclop
只是在尝试使用这种语言,看看什么是可能的,什么是不可能的。 :) - John Assymptoth
1
@biziclop - 我认为,给出一个“不相关”的答案总比不回答要好,因为“不相关”的答案可能会导致正确的答案,但是“没有答案”永远不会。 :) 随时随地都可以错误地回答我的问题。我从不因此给出负面评价。 - John Assymptoth
1
好吧,其实你不需要这样做。但是我之前因为看不懂问题而被冤枉成了白痴。:) 我并没有冒犯的意思,当然我会尽力回答问题,只是需要更加谨慎一些。 - biziclop
6个回答

7
在Java中,return语句可以出现在哪里?除了方法/构造函数体内之外?
只能在构造函数或方法中:
JLS - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767 返回语句将控制权返回给方法(§8.4,§15.12)或构造函数(§8.8,§15.9)的调用者。

此外,构造函数可以返回什么吗?

不行。

JLS - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767

带表达式的return语句 必须包含在声明要返回一个值的方法中(§8.4)或者会出现编译时错误。


我只能使用“return;”而没有任何表达式跟随吗?

是的。

JLS - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767

一个没有表达式的返回语句必须包含在声明为不返回任何值的方法(§8.4)或构造函数(§8.8)的主体中。


1
很棒的、有结构的答案,需要强调的地方都强调了。太棒了。 - John Assymptoth
@John - 感谢您的反馈。这让我们的努力更加值得。 - Bert F

5
这个和许多其他语言相关的问题的权威来源是Java Language Specification,在这种情况下是第14.17节

return语句将控制返回给方法(§8.4, §15.12)或构造函数(§8.8, §15.9)的调用者。

ReturnStatement:
   return Expressionopt;

没有Expression的return语句必须包含在使用关键字void声明不返回任何值的方法的主体中(§8.4),或包含在构造函数(§8.8)的主体中。如果return语句出现在实例初始化程序或静态初始化程序中(§8.7),则会发生编译时错误。没有Expression的return语句试图将控制权转移到包含它的方法或构造函数的调用者。

要精确,没有Expression的return语句始终会突然完成,原因是没有返回值的返回。

请注意,这明确指出您可以在构造函数中使用return语句,但限制它只能用于构造函数和方法。


JLS确实是应该首先咨询的地方。+1 - John Assymptoth
1
有趣的是,由于return会突然完成,如果你在finally块中放置一个return,则从相应的try块抛出的任何异常或返回的值都将消失得无影无踪。 - biziclop
@biziclop:有趣……这似乎是“摆脱”异常的快速方法。得试试。 - John Assymptoth
@John Assymptoth 实际上恰恰相反。如果你想摆脱一个异常,只需捕获它并什么也不做即可。但这可能是个潜在的陷阱。 - biziclop
@John Assymptoth 即使如此,也不要这样做。写catch(Exception e) {}finally { return; }并没有更复杂的区别,而且不要忘记后者会覆盖你可能已经有的任何正常返回值。 - biziclop

4

return语句可以出现在方法或构造函数的任何位置。

如果方法有返回类型,return后面应该跟上与其类型兼容的值。如果方法是void,则不返回任何内容。

构造函数根本没有返回类型(根据定义)。因此,如果您在构造函数中编写return语句,则不应在其后面跟任何值。


0

在返回类型为void的方法中,您可以使用不带值的return语句。但在其他方法中则不行。

例如:

    public void test(String s) {
       if (s.equals("")) {
          return;
       }
    }

一个构造函数不应该在其主体内有一个返回语句,因为按定义,构造函数没有返回类型。
编辑:正如Jon Skeet所指出的那样,构造函数可以有没有值的返回语句,但在大多数情况下不会使用。

你可以在构造函数中使用返回语句而不会出现问题。这是完全合理的,可以用于“提前退出”的原因,尽管相对较少。 - Jon Skeet
这就是为什么构造函数通常不应该有返回语句,但也可以有 ;) - anon

0

我不确定return语句可以在哪里使用(或者规范确切地说了什么)。它们最常用于方法内返回值(或以无返回值结束方法)。

构造函数不能返回任何值。调用构造函数将使VM为您创建的对象分配内存大小,然后调用对象内的适当构造函数,这是与调用方法的过程不同的过程。可能可以使用return语句,但是不能从构造函数本身返回任何值。

要从构造函数“返回”信息(更恰当地说,指示在构建过程中出现问题),可以使用异常。


0
我更喜欢在方法中只有一个返回语句,在构造函数中没有返回语句。相比于得到的最佳实践,再增加一级缩进通常是微不足道的。这通常可以使代码更易读。如果我有一个本地变量用于最终返回的值,那么通常会让我有可能将该变量声明为final,以确保该变量只被分配一次。这经常能够帮助您了解算法的实际复杂性。然而,我确实会在方法中使用多个throws语句。我也更喜欢拥有一个通过合同设计,在方法开始时检查前置条件并在javadoc中说明。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接