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

2023-12-26

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

    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(使用前将#替换为@)

Java 自动装箱和三元运算符的疯狂 的相关文章

随机推荐

  • 进行顺序比较的优雅方法 (C++)

    假设我有一个包含多个成员变量的类 class MyClass std string a int b SomeOtherClass c some stuff public some other stuff 我想定义关系运算符 operator
  • Android中使用NDK(C/C++)对图像应用灰度效果

    我想使用 NDK 将灰度效果应用于图像 为此 我在谷歌上搜索了很多 但发现了相同的结果 该结果返回的图像有点像负片 这就是我所相信的 我想要的是 例如 我有这张原图 应用灰度效果后应该是这样的 我已经尝试过 我想使用 NDK 实现此功能 因
  • 将从 Urlretrieve 下载的文件保存到其他文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 目前 此功能正常工作 并且可以正确下载文件 但将它们放在运行它的同一文件夹中 但我该如何将它们移动到 c downloads 或类似的文件
  • 如何使用修改后的标头进行 HTTP GET?

    在 Ruby 中使用修改后的标头发出 HTTP GET 请求的最佳方法是什么 我想从日志文件末尾获取一系列字节 并且一直在玩弄以下代码 但是服务器返回一个响应 表示 这是服务器无法理解的请求 服务器是阿帕奇 require net http
  • 在 ol 项目 html 上实现子编号

    我不确定它叫什么 但是否可以实现以下格式 1 1 1 1 2 1 2 1 1 2 2 1 3 我想就这些了 谢谢 事实上 有几种选项在鲁棒性和支持方面有所不同 在生成列表的代码中执行此操作 提供了is毕竟生成了 HTML 维基百科就是这样做
  • NSMutableString appendString 生成 SIGABRT 错误

    新来的 这个论坛和 Xcode 所以请耐心等待 在过去的几天里 我断断续续地花了几个小时试图找出我在这里到底做错了什么 但我似乎无法找出我的问题 这是我的代码的相关部分 我相信 在标题中 interface BlahViewControll
  • 如何从反应本机页面返回本机视图控制器?

    我用一个包装了一个反应本机页面UIViewController 并用导航控制器推送它 但是如何使用react native js代码弹出到本机页面 最简单的方法是拥有一个引用您的属性UIViewController在你的AppDelegat
  • 加速 RcppArmadillo:如何链接到 R 包中的 OpenBlas

    我正在开发一个使用 RcppArmadillo 的 R 包 我正在尝试利用 OpenBLAS 中更快的矩阵乘法 在里面文档 http arma sourceforge net faq html blas lapack replacement
  • 为什么不能直接将带有小数点的数字分配给十进制类型而不使用类型后缀?

    为什么不能直接将带小数点的数字赋给十进制类型而不使用类型后缀 这种数字不就被认为是小数类型的数字吗 decimal bankBalance 3433 20 ERROR Edit 我可能错过了问题的最后一部分 所以下面的概述几乎没有用 不管怎
  • 从网络导入 Mathematica 中的表格 - 空单元格问题

    I use data Import http weburl Data 从一个站点导入数据 该页面上有表格 这将创建嵌套列表 您可以轻松获取表格形式的数据 例如 Grid data 1 会给出这样的东西 Player Age Shots Go
  • 线程相对于 Runnable 的优势[重复]

    这个问题在这里已经有答案了 可能的重复 Java 实现 Runnable 与 扩展线程 https stackoverflow com questions 541487 java implements runnable vs extends
  • 在 PostgreSQL 查询中按降序聚合字符串

    除了问题之外如何在 PostgreSQL group by 查询中连接字符串字段的字符串 https stackoverflow com questions 43870 how to concatenate strings of a str
  • Python - 将非常大 (6.4GB) XML 文件转换为 JSON

    本质上 我有一个 6 4GB XML 文件 我想将其转换为 JSON 然后将其保存到磁盘 我目前正在运行 OSX 10 8 4 配备 i7 2700k 和 16GB 内存 并运行 Python 64 位 双重检查 我收到一个错误 提示我没有
  • 如何使用 beforeUpdate Hook Sequelize 中止更新操作

    我如何使用sequelize上的beforeUpdate钩子中止更新操作并返回一个对象作为中止更新的结果 如果我有类似的东西 User beforeUpdate function user options if user name exam
  • TWTRTwitter sessionStore 现在返回 TWTRAuthSession:那么现在如何访问 userName 属性呢?

    使用 Swift 中的 TwitterKit 3 3 0sharedInstance sessionStore session 现在返回一个TWTRAuthSession而不是一个TWTRSession 像之前一样 事情发生了变化 但这很好
  • PerformBlockAndWait 造成死锁

    我正在编写一个执行一些 CoreData 操作的函数 我希望该函数仅返回after所有 CoreData 操作均已执行 CoreData 的内容涉及在后台上下文中创建一个对象 然后在父上下文中执行更多操作 void myFunction N
  • 声明和未声明变量的影响

    JavaScript 声明变量和未声明变量之间的主要区别是什么 删除运算符对声明的变量不起作用 var y 43 declares a new variable x 42 delete x returns true x is a prope
  • 我是否正确消毒/逃生?

    我用 PHP 编写了一个简单的搜索脚本 用于搜索 mySQL 数据库并输出结果 它的工作原理是这样的 用户通过搜索表单搜索 jack s 我的 PHP 脚本GET就是这个搜索 并对其进行清理 然后是脚本 使用SELECT and LIKE
  • 检查 C++ 中多个值的相等性

    我正在 C 中寻找一种简单 快速且描述性的方法来检查某个值是否包含在一组固定的其他值中 就像在 Python 中一样 人们可以在其中编写 if some function in 2 3 5 7 11 do something 一些明显的选择
  • Java 自动装箱和三元运算符的疯狂

    刚刚花了几个小时调试这段代码 令人沮丧 LinkedHashMap