【问题标题】:In Java, where can a return statement appear?在Java中,return语句可以出现在哪里?
【发布时间】:2011-06-18 19:24:16
【问题描述】:

除了在方法/构造函数体中?

另外,构造函数是否可以返回一些东西?或者我可以只使用“return;”而不使用任何表达式吗?

【问题讨论】:

  • 您到底在做什么?你在问一些奇怪的“语言法”问题,这让我很好奇:-)
  • 由于前几天我误解了一个,所以我不会傻傻地回答另一个。 :)
  • 只是尝试使用该语言。看看什么是可能的,什么是不可能的。 :)
  • @biziclop - 在我看来,最好给出一个“不相关”的答案,而不是根本没有答案,因为一个“无关”的答案可能会导致正确的答案,但一个“不相关”的答案“ 从来不会。 :) 总是随意错误地回答我的问题。我从不对此投反对票。
  • 好吧,你不知道。但我之所以看起来像个白痴,仅仅是因为我无法相信我正在阅读的内容确实是问题所在。 :) 无意冒犯,当然我会尽量回答问题,我只需要更加谨慎。

标签: java return-value return


【解决方案1】:

在 Java 中,return 语句可以出现在哪里?除了在方法/构造函数体内?

仅在构造函数或方法中:

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

return 语句将控制权返回给方法(第 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

必须在使用关键字 void 声明的方法的主体中包含没有表达式的 return 语句,而不是返回任何值(第 8.4 节) , 或在构造函数的主体中(第 8.8 节)

【讨论】:

  • 很好,有条理,回答,在需要的地方强调。太棒了。
  • @John - 感谢您的反馈。让努力变得更值得。
【解决方案2】:

这个和许多其他语言律师问题的真相来源是Java Language Specification,在这种情况下section 14.17

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

退货声明:
return 表达式opt;

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

准确地说,没有表达式的 return 语句总是突然完成,原因是没有值的 return。

请注意,这明确表明您可以在构造函数中使用 return 语句 - 但它确实将其限制为构造函数和方法。

【讨论】:

  • JLS 确实是第一个应该咨询的地方。 +1
  • 有趣的是因为return突然完成,如果你把return放在finally块中,任何抛出的异常或从相应的try块返回的值都会消失一个痕迹。
  • @biziclop:有趣……这似乎是“摆脱”异常的快速方法。一定要试试。
  • @John Assymptoth 在实践中恰恰相反。如果你想摆脱一个异常,只需抓住它,什么也不做。不过,这是一种潜在的香蕉皮。
  • @John Assymptoth 即使那样,也不要。编写catch(Exception e) {} 并不比编写finally { return; } 更复杂,不要忘记后者会覆盖您可能拥有的任何正常返回值。
【解决方案3】:

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

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

构造函数根本没有返回类型(根据定义)。因此,如果您将 return 语句写入构造函数,则不应跟随任何值。

【讨论】:

    【解决方案4】:

    我不确定在哪里可以使用 return 语句(或者规范所说的确切内容)。它们最常用于方法中返回值(或结束没有返回值的方法)。

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

    要从构造函数“返回”信息(更恰当地说,表示构造过程中有问题),可以改用异常。

    【讨论】:

      【解决方案5】:

      您可以在返回类型为 void 的方法中使用不带值的返回。在其他方法中这是不可能的。

      例如

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

      构造函数的主体中不应有 return 语句,因为根据定义,构造函数没有返回类型。

      编辑:正如 Jon Skeet 指出的那样,构造函数可以有没有值的 return 语句,但在大多数情况下,这是不使用的。

      【讨论】:

      • 您可以毫无问题地在构造函数中使用 return 语句。出于“早出”的原因,这样做是完全合理的,尽管相对很少见。
      • 这就是为什么构造函数一般不应该有 return 语句但可以有 ;)
      【解决方案6】:

      我更喜欢在方法中只有一个 return 语句,而在构造函数中没有 return 语句。与您从最佳实践中获得的结果相比,多一层缩进通常是一件容易接受的事情。它通常使代码更具可读性。如果我有一个最终返回的值的局部变量,它通常使我可以将该变量声明为 final,这样我就可以绝对确定该变量只分配了一次。通常,这可以让您深入了解算法的实际复杂性。但是,我确实在一个方法中使用了多个 throws 语句。此外,我更喜欢按合同设计,在方法开始时检查前置条件并在 javadoc 中说明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 2014-02-28
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        • 2017-02-03
        • 2013-07-31
        相关资源
        最近更新 更多