2017-04-04 139 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));