刚刚花了几个小时调试这段代码,令人沮丧:
LinkedHashMap<String, Integer> rsrqs = new LinkedHashMap<String, Integer>();
Integer boxedPci = 52;
Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : -1;
上面的代码产生了一个 NullPointerException。下面的代码没有:
LinkedHashMap<String, Integer> rsrqs = new LinkedHashMap<String, Integer>();
Integer boxedPci = 52;
Integer boxedRsrq = boxedPci != null ? rsrqs.get(boxedPci.toString()) : Integer.valueOf(-1);
唯一的区别是用 Integer.valueOf() 包装 -1。我确信一旦有人解释为什么这段代码的行为方式我会拍我的额头..但是有人可以向我解释为什么这段代码的行为方式:)?
--
Edit
再想一想,我怀疑 NPE 来自 rsrqs.get() 返回 null,我认为 java 正在尝试将其拆箱为 int,然后装箱回 Integer。 Integer.valueOf() 强制 Java 执行拆箱步骤。故事的道德启示;不要只是忽略 Eclipse 中的那些拳击警告;)
三元表达式与任何表达式一样,具有由编译器确定的类型。如果三元表达式的两侧具有看起来不同的类型,则编译器将尝试使用两个选项中最不明确的选项来查找公共基类型。就你而言,-1
是最不模糊的,所以三元表达式的类型是int
。遗憾的是,编译器不使用基于接收变量的类型推断。
表达方式rsrqs.get(boxedPci.toString())
然后被评估并强制输入类型int
匹配三元表达式,但因为它是null
它抛出 NPE。
通过拳击-1
,三元表达式的值为Integer
,所以你是空安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)