2012-12-15 71 views
9

這不會編譯並出現以下錯誤:Illegal start of expression。爲什麼?爲什麼我在使用三元運算符時不能拋出異常

public static AppConfig getInstance() { 
     return mConfig != null ? mConfig : (throw new RuntimeException("error")); 
    } 
+4

因爲'throw'不是表達式 –

+0

「返回(拋出新的RuntimeException(」 錯誤「)) ;」 - 你不能返回拋出新的異常() –

+0

空值對象模式在這裏值得一提。 –

回答

11

這是因爲java中的三元運算符采用expression ? expression : expression的形式,並且您將聲明作爲最後一部分。這是沒有意義的,因爲一個聲明沒有給出一個值,而表達式。當Java發現條件是錯誤的並試圖給出第二個值時,Java意味着要做什麼?沒有價值。

三元運算符旨在允許您快速在兩個變量之間進行選擇,而無需使用完整的if語句 - 這不是您正在嘗試執行的操作,所以不要使用它,最好的解決方案就是:

public static AppConfig getInstance() { 
    if (mConfig != null) { 
     return mConfig; 
    } else { 
     throw new RuntimeException("error"); 
    } 
} 

三元運算符的目的不是產生副作用 - 雖然它可以做成能產生他們,讀書人也不會想到的是,所以它的更好使用真實if語句,以它清楚。

0

您正在嘗試返回throw new RuntimeException("error")。這就是你錯誤的原因。因爲在true的情況下您要退回AppConfig,並且在false的情況下您要退回exception

14

您可以編寫一個實用方法

public class Util 
{ 
    /** Always throws {@link RuntimeException} with the given message */ 
    public static <T> T throwException(String msg) 
    { 
     throw new RuntimeException(msg); 
    } 
} 

而且使用這樣的:

public static AppConfig getInstance() 
{ 
    return mConfig != null ? mConfig : Util.<AppConfig> throwException("error"); 
} 
+0

爲什麼不聲明'throwException'作爲返回'Object'? – Navin

+0

@Navin對象需要在主叫方投射。 'T'不需要強制轉換(至少有些時候...取決於編譯器)。在Java 8中,甚至不需要''(編譯器可以算出它) –

+0

好吧,這很方便:) – Navin

相關問題