三元if-else的自动拆箱需求

91S*_*Sky 24 java if-statement conditional-operator

这段代码工作正常:-

    Integer nullInt = null;
    if (1 <= 3) {
        Integer secondNull = nullInt;
    } else {
        Integer secondNull = -1;
    }
    System.out.println("done");
Run Code Online (Sandbox Code Playgroud)

但这会引发空指针异常,而 Eclipse 警告需要自动拆箱:-

    Integer nullInt = null;
    Integer secondNull = 1 <= 3 ? nullInt : -1;
    System.out.println("done");
Run Code Online (Sandbox Code Playgroud)

为什么会这样,有人可以指导吗?

Era*_*ran 22

三元条件表达式的类型

1 <= 3 ? nullInt : -1
Run Code Online (Sandbox Code Playgroud)

int(JLS 包含几个表,根据第二个和第三个操作数的类型描述三元条件运算符的类型)。

因此,当它尝试拆箱nullInt到 an 时intNullPointerException会抛出 a 。

为了获得 if-else 代码段的行为,您需要编写:

1 <= 3 ? nullInt : Integer.valueOf(-1)
Run Code Online (Sandbox Code Playgroud)

现在表达式的类型将为Integer,因此不会发生拆箱。

  • 只是为了添加您的答案,这里是提到的表格:https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25 (4认同)