gpt4 book ai didi

Java 自动装箱和三元运算符的疯狂

转载 作者:IT老高 更新时间:2023-10-28 20:57:15 26 4
gpt4 key购买 nike

只花了几个小时调试这段代码,令人沮丧:

    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。我敢肯定,一旦有人解释了为什么这段代码的行为方式是这样的,我会打我的额头。但是有人可以向我解释为什么这段代码的行为方式是这样的:)?

--编辑

再想一想,我怀疑 NPE 来自返回 null 的 rsrqs.get(),我认为 java 正在尝试将其拆箱为 int,然后再装箱为 Integer。 Integer.valueOf() 强制 Java 执行拆箱步骤。故事的道德启示;不要只是忽略 Eclipse 中的那些装箱警告;)

最佳答案

与任何表达式一样,三元表达式具有由编译器确定的类型。如果三元表达式的两侧具有看起来不同的类型,则编译器将尝试使用两个选项中最不模糊的选项来查找公共(public)基类型。在您的情况下,-1 是最不模糊的,因此三元表达式的类型是 int。遗憾的是,编译器不使用基于接收变量的类型推断。

然后计算表达式 rsrqs.get(boxedPci.toString()) 并强制转换为类型 int 以匹配三元表达式,但因为它是 null 它抛出 NPE。

通过装箱-1,三元表达式的值是Integer,所以你是空安全的。

关于Java 自动装箱和三元运算符的疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com