当前位置: 首页 > 知识库问答 >
问题:

Java自动装箱与三值运算符疯狂

西门洛城
2023-03-14
    LinkedHashMap<String, Integer> rsrqs = new LinkedHashMap<String, Integer>();
    Integer boxedPci = 52;
    Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : -1;
    LinkedHashMap<String, Integer> rsrqs = new LinkedHashMap<String, Integer>();
    Integer boxedPci = 52;
    Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : Integer.valueOf(-1);

--编辑

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

共有1个答案

傅兴平
2023-03-14

从java语言规范15.25中的信息可以得出解释。条件运算符?:。

从那里的表中,您可以获得这样的信息:如果第二个操作数(rsrqs.get(boxedpci.tostring()))是integer类型,而第三个操作数是int类型,则结果将是int类型。

然而,这意味着

Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : -1;

语义上与

Integer boxedRsrq = boxedPci != null ? ((int)rsrqs.get(boxedPci.toString())) : -1;

但这意味着,如果从映射中获得nullpointerexception,则获得nullpointerexception,这显然会发生。

如果将第三个操作数转换为integer,则第二个操作数将永远不会转换为int,也不会发生NPE。

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

  • 问题内容: 为什么会抛出 虽然这不是 解决方案是通过替换false方式Boolean.FALSE来避免null被取消装箱-这boolean是不可能的。但这不是问题。问题是为什么?JLS中是否有任何引用可以证实这种行为,尤其是第二种情况? 问题答案: 别在于方法的显式类型returnsNull()会在编译时影响表达式的静态类型: 参见Java语言规范,第15.25节“ 条件运算符?”。: 对于E1,

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

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

  • 问题内容: 为什么第二段代码更快? 问题答案: 自动装箱使用,内部将Integer对象缓存为小整数(默认情况下为-128至127,但是最大值可以使用“ java.lang.Integer.IntegerCache.high”属性进行配置-请参见Integer.valueOf的源代码) ,因此与直接调用不同。因为在调用之前可以快速检查整数值的大小,所以直接调用要快一些(尽管如果您有很多小整数,它会使