這不會編譯並出現以下錯誤:Illegal start of expression
。爲什麼?爲什麼我在使用三元運算符時不能拋出異常
public static AppConfig getInstance() {
return mConfig != null ? mConfig : (throw new RuntimeException("error"));
}
這不會編譯並出現以下錯誤:Illegal start of expression
。爲什麼?爲什麼我在使用三元運算符時不能拋出異常
public static AppConfig getInstance() {
return mConfig != null ? mConfig : (throw new RuntimeException("error"));
}
這是因爲java中的三元運算符采用expression ? expression : expression
的形式,並且您將聲明作爲最後一部分。這是沒有意義的,因爲一個聲明沒有給出一個值,而表達式。當Java發現條件是錯誤的並試圖給出第二個值時,Java意味着要做什麼?沒有價值。
三元運算符旨在允許您快速在兩個變量之間進行選擇,而無需使用完整的if
語句 - 這不是您正在嘗試執行的操作,所以不要使用它,最好的解決方案就是:
public static AppConfig getInstance() {
if (mConfig != null) {
return mConfig;
} else {
throw new RuntimeException("error");
}
}
三元運算符的目的不是產生副作用 - 雖然它可以做成能產生他們,讀書人也不會想到的是,所以它的更好使用真實if
語句,以它清楚。
您正在嘗試返回throw new RuntimeException("error")
。這就是你錯誤的原因。因爲在true
的情況下您要退回AppConfig
,並且在false
的情況下您要退回exception
。
您可以編寫一個實用方法
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");
}
因爲'throw'不是表達式 –
「返回(拋出新的RuntimeException(」 錯誤「)) ;」 - 你不能返回拋出新的異常() –
空值對象模式在這裏值得一提。 –