主要观点总结
本文介绍了关于社群交流、开源项目、知识回顾、自动拆箱和装箱机制、三目运算符等内容。文章提供了部分资源链接和代码示例,并详细解释了自动拆箱和装箱的原理以及在实际应用中的注意事项。
关键观点总结
关键观点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 方法了,直接
=