java: 奇怪的 NullPointerException in ternary operator (? : )

请考虑以下代码片段:

private static void doSomething(Double avg, Double min, Double sd) {
    final Double testMin;
    if (avg != null) {
        testMin = Math.max(min, avg - 3 * sd);
    } else {
        testMin = min;
    }
    System.out.println("testMin=" + testMin);

    final Double verwachtMin = avg != null ? Math.max(min, avg - 3 * sd) : min;
    System.out.println("verwachtMin=" + verwachtMin);
}

据我所知(以及我的IDE可以告诉我的),变量和应该是等效的。testMinverwachtMin

正如你所料,我宁愿写最后2行而不是前7行。但是,当我向此方法传递 3 个空值时,我在变量的计算上会得到一个 NPE。verwachtMin

有谁知道这是怎么发生的?三元算子是否评估第二部分,即使条件不是?true

(Java 版本 1.6.0_21)


答案 1

尝试:

final Double verwachtMin = avg != null ? new Double(Math.max(min, avg - 3 * sd)) : min;

final Double verwachtMin = avg != null ? Double.valueOf(Math.max(min, avg - 3 * sd)) : min;

三元运算符的交替边的类型是 和 ,这意味着 将 取消装箱到 ,然后在赋值时,我们有一个从 到 的装箱。如果 的值是 则取消装箱的 NPE。doubleDoubleDoubledoubledoubleDoubleminnull


答案 2

三元运算符是否评估第二部分,即使条件不为真

不 - 但它计算第三部分,我认为在这种情况下,它尝试自动unbox(导致NPE),因为的返回类型是原始的,并且决定了整个表达式的返回类型。minMath.max()double

自动装箱/-拆箱是魔鬼的。