当前位置: 首页 > 面试题库 >

java:三元运算符(?:)中的NullPointerException很奇怪

令狐良骏
2023-03-14
问题内容

请考虑以下代码片段:

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个空值时,在verwachtMin变量的计算上得到了NPE 。

有人知道这怎么可能吗?即使条件不满足,三元运算符也会评估第二部分true吗?

(Java版本1.6.0_21)


问题答案:

尝试:

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;

三元运算符的交替边的类型是doubleDouble,这意味着Double将get取消装箱到double,然后在赋值时,将装箱从doubleDouble。如果值minnull那么拆箱的NPE。



 类似资料:
  • 问题内容: 为什么此代码有效? 为什么这会引发异常? 但是最奇怪的是,该代码也可以成功运行,没有任何异常: 看来Java的三元运算符会改变行为。有人可以解释为什么吗? 问题答案: 该行为在JLS- 条件运算符中 指定: 如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,则 条件表达式的类型为T 。 强调我的。因此,在第二种情况下: 由于第三个操作

  • 问题内容: 我有时会从下面的行中得到。 添加括号后,就可以了。 请澄清我的行为。提前致谢。 问题答案: 永远不会为null,尽管有时是。 也就是说,等同于总是如此。

  • 问题内容: 是否可以更改此: …对三元运算符? 问题答案: 好吧,中的行为就像这样…… …另一种看待它的方式… 你的问题有点含糊,我们必须在这里假设。 如果(且仅当)声明了一个返回值(,等。)-现在看来似乎没有做到这一点通过你的代码-那么你可以做到这一点… 如果callFunction(…)不返回值,那么你将无法使用三元运算符!就那么简单。你将使用不需要的东西。 请发布更多代码以清除所有问题 尽管

  • 问题内容: 有人可以解释为什么这样的代码吗? 产生以下编译器错误: 不兼容的条件操作数类型ArrayList和HashSet 由于我不明白的原因,以下内容解决了该问题 我正在使用Java 1.4。 问题答案: 这是1.4 中的 错误 ,并已根据bugreport 5080917 进行了修复。 评估 这是一个错误。 xxxxx @ xxxxx 2004-07-30

  • 但最奇怪的是,这段代码也在没有任何异常的情况下成功运行: 看起来Java的三元运算符改变了行为。有人能解释一下这是为什么吗?

  • 问题内容: 前几天,我因三元运算符中意外的类型转换而遇到了一个非常奇怪的问题。鉴于此(无用的示例性)功能: 我期望编译后以下两个代码段完全相同: 与 。 事实证明,如果是,则-statement可以正常工作,而第二个代码段中的三元运算则抛出a 。似乎三元运算已决定将这两种选择都强制转换为类型,然后再将结果自动装箱为!?!。实际上,如果我将显式转换为,则该异常消失。换一种说法: 与以下内容不同: 。