2017-04-04 73 views
2

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

复制和粘贴以及整个方法为第二个实例添加一条返回行似乎相当浪费。

我认为加一个参数location,然后说:

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

但我真的不想返回任何东西,甚至null,我第一次引用此方法。

这可能吗?

+0

如果你的方法返回String然后使用return“”; – Omore

+0

“当我首先调用它时,我不希望它返回任何值”如果方法非空(如果不扔掉某些东西,那么),您总是必须返回一个值。为什么不忽略返回值? –

+0

我可以很容易地做到这一点。我只是好奇,如果这是可能的... – Eragon20

回答

3

您可以准确地用于此目的,如下图所示使用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()将返回值 。

+0

太棒了!这基本上是我在找的东西。谢谢! – Eragon20

+0

是的''Optional'真的很酷功能 – developer

+0

+1用于暗示使用'Optional'类,但是对于所描述的用例来说太费事了。如果想要将对象的返回值封装起来,可以用其他方法来完成。 :-) – PNS

1

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

如果方法的类型不是void且无法更改,则不可能返回任何内容。这也是一个很好的原因:返回值的方法通常用于填充某些数据类型的参数。

例如,考虑的方法

public abstract int calculate(); 

其由应用程序调用,用于计算一个值,该值被保存在一个参数以供随后使用,例如

int result = calculate(); 

会去到什么result,如果有一个选项可以从calculate()法“不返回任何东西”?

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

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

+0

好点。感谢您的回复。 – Eragon20

+0

不客气。 – PNS

2

如果您的方法有String作为其返回类型,则它必须始终返回String(或者为null或抛出异常)。从JLS Sec 8.4.7

如果一个方法被声明为具有(§8.4.5),则发生编译时间错误返回类型,如果该方法的主体可以正常完成(§14.1)。

“完全正常”是一个稍微有趣的短语,如果你不熟悉它。回报价值不是正常完成,相信与否。来自JLS Sec 14.1

如果所有步骤按照描述执行,没有突然完成的指示,则说该语句正常完成。然而,某些事件可能会阻止的语句从正常完成:

  • 断裂(§14.15),继续(§14.16),并返回(§14.17)语句将导致控制转移,可能会阻止正常完成包含它们的语句。

  • 某些表达式的评估可能会抛出Java虚拟机的异常(第15.6节)。显式抛出(§14.18)语句也会导致异常。异常导致可能阻止正常完成语句的控制权转移。

既然你在一个循环中不是,则不能使用breakcontinue;所以,你总是必须返回一个值或抛出,以避免正常完成。

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

2

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

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));