自动开箱需要三元 if-else

2022-09-01 20:58:39

这段代码工作正常:-

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

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

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

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


答案 1

三元条件表达式的类型

1 <= 3 ? nullInt : -1

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

因此,当它尝试将 box 拆解为 a 时,将抛出 a。nullIntintNullPointerException

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

1 <= 3 ? nullInt : Integer.valueOf(-1)

现在表达式的类型将是 ,因此不会进行取消装箱。Integer


答案 2

我很确定三元运算符的参数需要具有相同的类型。由于您使用 -1 和一些常量编译器会尝试取消装箱以获得值。然后自动框它以存储在变量中。nullintnullintsecondNull


推荐