专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  Spring Boot 中使用 JSON ... ·  昨天  
芋道源码  ·  高性能、无侵入的 Java 性能监控神器 ·  昨天  
Java编程精选  ·  手把手教你Java文件断点下载 ·  3 天前  
Java编程精选  ·  阿里员工吐槽:80%以上的leader认为, ... ·  4 天前  
芋道源码  ·  if 判断泛滥?试一试规则执行器,太香了! ·  2 天前  
51好读  ›  专栏  ›  芋道源码

重大线上事故!三元表达式引发的空指针问题…

芋道源码  · 公众号  · Java  · 2025-05-24 14:18

主要观点总结

本文介绍了关于社群交流、开源项目、知识回顾、自动拆箱和装箱机制、三目运算符等内容。文章提供了部分资源链接和代码示例,并详细解释了自动拆箱和装箱的原理以及在实际应用中的注意事项。

关键观点总结

关键观点1: 社群交流

介绍了一个有用的社群,提供一对一交流、面试小册、简历优化、求职解惑等服务。

关键观点2: 开源项目介绍

描述了一个破10w+的开源项目,涵盖前端、后端等功能,并提供了相关链接。

关键观点3: 知识回顾

回顾了三目运算符、自动拆箱和装箱机制等知识点,并提供了相关代码示例。

关键观点4: 问题重现和原理分析

通过一个实际例子展示了在使用三目运算符时由于自动拆箱导致的NullPointerException(NPE),并分析了其原因。

关键观点5: Java语言规范(JLS)关于三目运算符的规定

解释了JLS中关于三目运算符的类型判断规则,以及为什么编译器会在某些情况下进行自动拆箱。


正文

请到「今天看啥」查看全文


  • 问题重现
  • 原理分析

  • 属实刺激,刚入职不久就遇到这种史诗级的线上 Bug,首页直接崩溃,陈年老代码爆雷,不管落到最后的底层原因是什么,我感觉主要还是上下游的链路太过复杂,治理难度比较大,牵一发而动全身。

    知识回顾

    三目运算符大家都很熟悉了:

    1> ? 2> : 3>

    我习惯称为三元表达式,需要注意的就是: 一个三元表达式从不会既计算 ,又计算 。条件运算符是右结合的,也就是说,从右向左分组计算。例如, a ? b : c ? d : e 将按 a ? b : (c ? d : e) 执行。

    再来回顾下自动拆箱和装箱机制,Java 通过这种机制使得包装类和基本数据类型之间的转换更加方便:

    • 装箱:将基本数据类型转换成包装类(每个包装类的构造方法都可以接收各自数据类型的变量)。
    • 拆箱:从包装类之中取出被包装的基本类型数据(使用包装类的 xxxValue 方法)。

    下面以 Integer 为例,我们来看看 Java 内置的包装类是如何进行拆装箱的:

    Integer obj = new Integer(10);  // 装箱
    int temp = obj.intValue();   // 拆箱

    这种形式的代码是 JDK 1.5 以前的,JDK 1.5 之后,Java 设计者为了方便开发提供了自动装箱(Autoboxing)与自动拆箱的机制,并且可以直接利用包装类的对象进行数学计算。

    还是以 Integer 为例,我们来看看自动拆装箱的过程:

    Integer obj = 10;   // 自动装箱. 基本数据类型 int -> 包装类 Integer
    int temp = obj;   // 自动拆箱. Integer -> int
    obj ++; // 直接利用包装类的对象进行数学计算
    System.out.println(temp * obj); 

    基本数据类型到包装类的转换,不需要像上面一样使用构造函数,直接 = 就完事儿;同样的,包装类到基本数据类型的转换,也不需要我们手动调用包装类的 xxxValue 方法了,直接 =







    请到「今天看啥」查看全文