14

这不会编译并给出以下错误:Illegal start of expression. 为什么?

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

4 回答 4

17

你可以写一个实用方法

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");
}
于 2013-01-06T13:45:36.860 回答
14

这是因为 java 中的三元运算符采用 形式expression ? expression : expression,并且您将语句作为最后一部分。这是没有意义的,因为语句没有给出值,而表达式却给出了值。当 Java 发现条件为假并尝试给出第二个值时,它意味着什么?没有价值。

三元运算符旨在让您在不​​使用完整if语句的情况下快速在两个变量之间做出选择 - 这不是您想要做的,所以不要使用它,最好的解决方案很简单:

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

三元运算符不是为了产生副作用而设计的——虽然它可以产生副作用,但阅读它的人不会想到这一点,所以最好用一个真实的if陈述来说明清楚。

于 2012-12-15T11:42:50.300 回答
5

如果它对某人有帮助,这是使用 java 8+ 可选的答案:

public static AppConfig getInstance() {
    return Optional.ofNullable(mConfig).orElseThrow(() -> new RuntimeException("error"));
}
于 2018-05-12T12:07:46.073 回答
0

您正在尝试返回一个throw new RuntimeException("error"). 这就是您收到错误的原因。因为true万一你回来AppConfig了,false万一你回来了exception

于 2012-12-15T11:41:54.077 回答