这不编译并给出以下错误:Illegal start of expression
。为什么呢?
public static AppConfig getInstance() {
return mConfig != null ? mConfig : (throw new RuntimeException("error"));
}
答案 0 :(得分: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");
}
答案 1 :(得分:12)
这是因为java中的三元运算符采用expression ? expression : expression
形式,并且您将声明作为最终部分。这没有意义,因为语句没有给出值,而表达式则没有。当Java发现条件为false并尝试给出第二个值时,Java应该做什么?没有价值。
三元运算符旨在让您在不使用完整if
语句的情况下快速在两个变量之间进行选择 - 这不是您想要做的,所以不要使用它,最好解决方案很简单:
public static AppConfig getInstance() {
if (mConfig != null) {
return mConfig;
} else {
throw new RuntimeException("error");
}
}
三元运算符不是为了产生副作用而设计的 - 虽然可以制作副作用,但阅读它的人不会期望它,所以使用真正的if
语句来制作副作用要好得多清楚。
答案 2 :(得分:1)
如果它对某人有帮助,这里有一个使用java 8+的答案可选:
public static AppConfig getInstance() {
return Optional.ofNullable(mConfig).orElseThrow(() -> new RuntimeException("error"));
}
答案 3 :(得分:0)
您正在尝试返回throw new RuntimeException("error")
。这就是你得到错误的原因。因为在true
情况下,您将返回AppConfig
,而在false
情况下,您将返回exception
。