【问题标题】:java method return multiple valuesjava方法返回多个值
【发布时间】:2017-08-30 03:23:57
【问题描述】:

我有一个希望在程序中调用两次的方法。当我第一次调用它时,我不希望它返回任何值,但是当我在不同的类中调用它时,我希望它返回一个字符串output

对于第二个实例,复制和粘贴以及整个方法仅添加一个返回行似乎是一种浪费。

我考虑添加一个参数location然后说:

if (location.equals("location1")) {
    return null;
}
else {
    return output;
}

但我真的不想返回任何东西,即使是null,我第一次引用这个方法。

这可能吗?

【问题讨论】:

  • 如果你的方法返回 String 然后使用 return " ";
  • "当我第一次调用它时,我不希望它返回任何值" 你总是必须返回一个值,如果方法是非空的(如果你不扔东西,那是)。为什么不直接忽略返回值?
  • 我可以轻松做到这一点。我只是好奇这是否可能......
  • "non-null" 我的意思是非无效的。

标签: java methods return


【解决方案1】:

Java 是一种强类型语言。所有方法都有一个返回类型(包括void,即return nothing)。

如果方法的类型不是 void 并且无法更改,则不可能让方法不返回任何内容。这也是有充分理由的:返回值的方法通常用于填充某些数据类型的参数。

例如,考虑方法

public abstract int calculate();

由应用调用,用于计算一个值,保存在参数中以备后续使用,例如

int result = calculate();

如果calculate() 方法中有“不返回任何内容”的选项,result 会包含什么?

出于这个和许多其他原因,方法必须始终返回特定数据类型的值,或者是void 类型的值,这是由Java 编译器强制执行的。如果它确实返回一个值,则可以根据调用应用程序的需要使用或忽略它。

java.util.Optional 类的使用,在 Java 8 中介绍并在另一个答案中提出,可能不是最适合上述问题的用例的方法。话虽如此,关于Optional 的精彩讨论可以在another StackOverlow question 中找到。

【讨论】:

    【解决方案2】:

    如果您的方法将String 作为其返回类型,则它必须始终返回String(或null,或引发异常)。来自JLS Sec 8.4.7

    如果将方法声明为具有返回类型(第 8.4.5 节),则如果方法的主体可以正常完成(第 14.1 节),则会发生编译时错误。

    如果您不熟悉“正常完成”,它是一个有点有趣的短语。返回一个值并没有正常完成,信不信由你。来自JLS Sec 14.1

    如果所有步骤都按描述执行,没有任何突然完成的迹象,则称该语句正常完成。但是,某些事件可能会阻止语句正常完成:

    • break (§14.15)、continue (§14.16) 和 return (§14.17) 语句会导致控制权转移,这可能会阻止包含它们的语句的正常完成。

    • 对某些表达式的求值可能会引发 Java 虚拟机的异常(第 15.6 节)。显式 throw (§14.18) 语句也会导致异常。异常会导致控制权转移,这可能会阻止语句的正常完成。

    由于你不在循环中,你不能使用breakcontinue;因此,您总是必须返回一个值或 throw 以避免正常完成。

    最简单的做法就是不对调用方法的返回值做任何事情。

    【讨论】:

      【解决方案3】:

      你为什么不忽略第一个“位置”的返回值?或者,如果方法需要知道上下文,只需将参数传递给它并忽略第一个位置的返回值?像这样:

      public String myMethod(boolean calledFromFirstLocation) {
          if (calledFromFirstLocation) {
              // do something specific for 1st location
              return null; // ignore it later
          } else {
              return "output";
          }
      }
      

      然后就这样称呼它:

      // return value ignored, method knows it is being called from location1
      myMethod(true);
      // should print "output"
      System.out.println(myMethod(false));
      

      【讨论】:

        【解决方案4】:

        您可以使用Optional(来自Java8)完全用于此目的,如下所示:

        public Optional<String> myMethod(String location) {
           if (location.equals("location1")) {
             return Optional.empty();//returns empty Optional object
           } else {
             return Optional.of(output);//returns String wrapped by Optional
           }
        }
        

        我建议您查看java.util.Optional API here 和下面的文字(强调我的)。

        java.util.Optional 容器对象,可能包含也可能不包含非空值。如果一个 值存在,isPresent() 将返回 true,get() 将返回 价值。

        【讨论】:

        • 太棒了!这基本上就是我想要的。谢谢!
        • +1 用于建议使用 Optional 类,但对于所描述的用例来说,这太过分了。如果想将返回值包装在一个对象中,这可以通过许多其他方式来完成。 :-)
        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 2013-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        相关资源
        最近更新 更多