Java 三目表达式中的NullPointerException问题

  • 背景
  • 问题
  • 思考
  • 找资料
  • 反思

背景

旧系统改造。

问题

Integer rank = bpo.getLocalRank() != null ? Ints.tryParse(bpo.getLocalRank()) : 0

这段代码中。一眼看去,如果bpo.getLocalRank返回的空字符串,那么rank就会为null,没问题。

思考

但是运行一下,我们就发现报错了。

Exception in thread "main" java.lang.NullPointerException

根据前后代码分析,我们的bpo对象不可能为空。
在这个基础上,分析表达式,NPE错误不可能从Ints.tryParse中产生。那么NPE从那里来的呢。
想了下NPE错误只可能从Ints.tryParse(bpo.getLocalRank())中导致的。但是这个为什么会导致NPE错误呢。联合上下文。三目表达式,第3位参数位 为 primitive type 。是不是这个参数导致第二位参数的自动拆箱呢,是不是会和赋值表达式一样,存在默认类型转换。
是不是验证一下。代码改成如下

Integer rank = bpo.getLocalRank() != null ? Ints.tryParse(bpo.getLocalRank()) : Integer.valueOf(0);

没报错。那么问题就定位了。

找资料

确定了原因。就去找文档,找 Java规范。链接 ^1
中有一段描述 Numeric Conditional Expressions的。具体如下

15.25.2. Numeric Conditional Expressions
Numeric conditional expressions are standalone expressions (§15.2).
The type of a numeric conditional expression is determined as follows:
If the second and third operands have the same type, then that is the type of the conditional expression.
If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

很明显。如果三目运算符,一个是基本类型,一个是the result of applying boxing conversion (§5.1.7) to T。那么结果就是 T,也就是int类型。也就触发了我们的自动拆箱。并导致报错。
我们再反编译一下用jd-gui打开。看到类似如下代码。也得到了印证。

    Integer localInteger2 = Integer.valueOf("123".equals("123") ? localObject.intValue() : 0);

反思

  • 好了。问题解决。这个问题反应的还是我们JVM知识缺乏。从表面觉得没问题。没有深入了解JVM机制。

Java 三目表达式中的NullPointerException问题相关推荐

  1. java三目表达式_Java8新特性Lambda表达式

    1 Lambda表达式 对于很多计算机语言来说,Lambda表达式并不是陌生的语法格式,而对于Java而言,它的到来比较晚,直到Java8更新之后,Lambda表达式才正式出现在Java语法中.所以如 ...

  2. java三目表达式_史上最强《Java 开发手册》泰山版王者归来

    简介:潜力修炼一年之久的<Java 开发手册(泰山版)>今天发布!此次共计新增 34 条规约,修改描述 90 处,其中错误码规则更是第一次提出完整的解决方案,大家参考错误码示例表,欢迎大家 ...

  3. Java 三目运算 NullPointerException

    Java 三目运算涉及拆装箱过程,注意空指针异常 Integer a=null; Integer b=1==1?a:1 这里会抛空指针异常. Integer a=null; Integer b=1== ...

  4. Vue中绑定值与字符串拼接以及结合三目表达式实现是否为空判定的使用

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客_若依前后端分离搭建 Vue中在调 ...

  5. kotlin模拟java三目运算

    kotlin没有三目运算,一直都要if else,但是如果是空判断可以用?.?:连用模拟 代码: fun 判空模拟java三目运算(variable: Int? = null){variable?.l ...

  6. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

  7. 三目表达式如何省略一个表达式

    三目表达式若想省略一个表达式, 可以用 null 代替 举例: public class HelloWorld {public static void main(String[] args) {// ...

  8. Vue使用v-for与v-if搭配满足条件进行赋值,和v-if三目表达式的使用

    Vue使用v-for遍历的时候,通过{{}}进行赋值 {{user.companyName = item.companyName}} <select class="form-contr ...

  9. java里什么是三目表达式_浅谈Java三目运算

    三目条件运算公式为 x?y:z  其中x的运算结果为boolean类型,先计算x的值,若为true,则整个三目运算的结果为表达式y的值,否则整个运算结果为表达式z的值 例:String s=" ...

最新文章

  1. ming 贪心 NOIP模拟
  2. duilib 自带树形控件的认识
  3. python之多线程编程(一):基本介绍
  4. maven安装以及eclipse配置maven
  5. mysql导入竖杠分割的数据_MYSQL :逗号分隔串表,分解成竖表
  6. 中国市场新财富与新人群趋势
  7. HTML5 Canvas游戏开发(二)高级功能
  8. [转]安装完成后机器重新启动运行 JBuilder 时却每次只是看到 L
  9. 汉诺塔问题详解(C语言)
  10. 电阻式传感器原理与应用
  11. 使用STVD开发STM8S时中断的处理方法
  12. SageMath | Crypto Tool
  13. 2022-7 一套鼠标键盘控制两台及以上电脑
  14. 学习日志之synthesis and optimization(7)——Heuristic optimization
  15. linux桌面lxde 安装_ArchLinux下LXDE的安装与设置心得
  16. 2020年,你必须掌握的前端技术栈
  17. php户型图识别,5分钟教你马上看懂户型图
  18. 用python处理excel数据做函数_如何使用python通过函数式编程完成excel中的数据处理及分析工作...
  19. 【面经】国信证券数据清算工程师面经
  20. 寄存器和存储器的区别?

热门文章

  1. 极品飞车21·热度,无小键盘
  2. MEMO与以太坊达成战略合作
  3. 查看linux系统是哪个厂商版本的命令
  4. mysql查询重复的_MySQL查询重复记录sql语句
  5. Java 法师与战士
  6. 使用DevExpress WPF主题设计器轻松创建Office 2019绿色主题(二)
  7. Centos6.5编译安装zabbix2.2通过snmp协议监控路由器
  8. 西部专属的云安全人才培养计划长啥样?
  9. PLSQL12.07安装使用教程(1)
  10. Selenium自动化测试框架开发