为什么我不能在使用三元运算符时抛出异常

Eug*_*ene 12 java android

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

public static AppConfig getInstance() {
        return mConfig != null ? mConfig : (throw new RuntimeException("error"));
    }
Run Code Online (Sandbox Code Playgroud)

Ven*_*aju 14

你可以写一个实用工具方法

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

并像这样使用它:

public static AppConfig getInstance() 
{
    return mConfig != null ? mConfig : Util.<AppConfig> throwException("error");
}
Run Code Online (Sandbox Code Playgroud)

  • @jonsinfinity Util是定义了throwException的类.为了清楚起见,我更新了我的答案 (2认同)

Gar*_*tty 12

这是因为java中的三元运算符采用了表单expression ? expression : expression,并且您将声明作为最终部分.这没有意义,因为语句没有给出值,而表达式则没有.当Java发现条件为false并尝试给出第二个值时,Java应该做什么?没有价值.

三元运算符旨在让您在不​​使用完整if语句的情况下快速在两个变量之间进行选择- 这不是您尝试做的事情,因此不要使用它,最好的解决方案就是:

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

三元运算符不是为了产生副作用而设计的 - 虽然可以制作副作用,但阅读它的人不会期望这样,所以使用真实的if语句来说清楚它会好得多.


mjj*_*409 6

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

public static AppConfig getInstance() {
    return Optional.ofNullable(mConfig).orElseThrow(() -> new RuntimeException("error"));
}
Run Code Online (Sandbox Code Playgroud)