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

NullPointerException通过Java三元运算符的自动装箱行为

暨弘懿
2023-03-14
问题内容

NullPointerException几天,我因三元运算符中意外的类型转换而遇到了一个非常奇怪的问题。鉴于此(无用的示例性)功能:

Integer getNumber() {
    return null;
}

我期望编译后以下两个代码段完全相同:

Integer number;
if (condition) {
    number = getNumber();
} else {
    number = 0;
}

Integer number = (condition) ? getNumber() : 0;

事实证明,如果conditiontrue,则if-statement可以正常工作,而第二个代码段中的三元运算则抛出a
NullPointerException。似乎三元运算已决定将这两种选择都强制转换为类型,int然后再将结果自动装箱为Integer!?!。实际上,如果我将显式转换0Integer,则该异常消失。换一种说法:

Integer number = (condition) ? getNumber() : 0;

与以下内容不同:

Integer number = (condition) ? getNumber() : (Integer) 0;

因此,似乎三元运算符和等效if- else语句之间存在字节码差异(这是我没想到的)。这就提出了三个问题:为什么会有区别?这是三元实现中的错误还是类型转换的原因?鉴于存在差异,三元运算的性能是否比等效if语句高(或低)(我知道,差异不可能很大,但仍然可以)?


问题答案:

根据JLS:

条件表达式的类型确定如下:

  • 如果第二个操作数和第三个操作数具有相同的类型(可能为null类型),则这是条件表达式的类型。
  • 如果第二个操作数和第三个操作数之一是原始类型T,而另一个操作数的类型是对T应用装箱转换
    (第5.1.7节)的结果,则条件表达式的类型为T。




 类似资料:
  • 问题内容: 仅仅花了几个小时调试以下代码: 上面产生了一个NullPointerException。以下代码没有: 唯一的区别是用Integer.valueOf()包装-1。我敢肯定,一旦有人解释了为什么这段代码的行为方式如此,我就会打我的额头。但是有人可以向我解释为什么这段代码的行为方式:)吗? -编辑 再次考虑,我怀疑NPE来自返回null的rsrqs.get(),我认为Java在将其装箱回I

  • --编辑 再考虑一下,我怀疑NPE来自返回null的rsrqs.get(),我认为java试图在装箱返回整数之前将其解框为int。integer.valueOf()强制Java执行unbox-box步骤。故事的寓意;不要只是忽略Eclipse中的那些拳击警告;)

  • 本文向大家介绍Java三目运算中隐藏的自动拆装箱,包括了Java三目运算中隐藏的自动拆装箱的使用技巧和注意事项,需要的朋友参考一下 最近修改线上bug的时候排查了一个十分隐藏的bug,直接上代码: 乍一看是没什么毛病的,但是已运行就会发现报空指针,在idea里面也会警告可能有空指针,这是什么原因呢? 直接看字节码: 可以看到字节码中调用了`Integer.valueOf()`方法,因为我们代码中一

  • 问题内容: 请考虑以下代码片段: 据我所知(以及我的IDE可以告诉我的),变量和应该是等效的。 如您所料,我宁愿写最后2行而不是前7行。但是,当我向该方法传递3个空值时,在变量的计算上得到了NPE 。 有人知道这怎么可能吗?即使条件不满足,三元运算符也会评估第二部分吗? (Java版本1.6.0_21) 问题答案: 尝试: 要么 三元运算符的交替边的类型是和,这意味着将get取消装箱到,然后在赋值

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