浅谈JAVA最常见的装箱/拆箱坑
1. Integer / Long 判等用 ==
Integer a = 128; Integer b = 128; System.out.println(a == b); // false
很多人以为是 true,但这是比较“对象地址”,不是比较值。
正确写法:
Objects.equals(a, b)
或者:
a.equals(b)
但 a.equals(b) 要注意 a 不能为 null,所以更稳的是:
Objects.equals(a, b)
这个坑在 Long id、Integer status 上特别常见。
2. 包装类型和基本类型比较触发拆箱,null 会空指针
Integer status = null;
if (status == 1) {
...
}
这会报 NullPointerException。 因为它会自动拆箱成:
status.intValue() == 1
更安全的写法:
Integer.valueOf(1).equals(status)
或者:
Objects.equals(status, 1)
3. Boolean 当成 boolean 用,null 会炸
Boolean deleted = null;
if (deleted) {
...
}
这也会空指针。因为 Java 会自动拆箱:
if (deleted.booleanValue()) {
...
}
安全写法:
Boolean.TRUE.equals(deleted)
如果判断 false:
Boolean.FALSE.equals(deleted)
这个在配置项、开关字段里特别常见。
4. 数据库字段是 Integer / Long,直接赋给基本类型
Integer dbValue = null; int value = dbValue;
这会空指针,因为这里发生了拆箱。
正确做法:
int value = dbValue == null ? 0 : dbValue;
或者保持包装类型:
Integer value = dbValue;
如果数据库字段允许为空,Java 实体通常就应该用包装类型,不要用基本类型。
5. 集合里必须用包装类型,不能用基本类型
这个不算坑,但很常见
List<int> ids = new ArrayList<>();
这是错的,Java 泛型不能用基本类型。
只能写:
List<Integer> ids = new ArrayList<>();
这里就涉及自动装箱/拆箱,比如:
ids.add(1); // 自动装箱成 Integer int x = ids.get(0); // 自动拆箱成 int
如果 ids.get(0) 返回 null,这里也可能炸。
6. 三元表达式里混用包装类型和基本类型
Integer a = null; int b = true ? a : 0;
这个也可能空指针,因为 a 会被拆箱成 int。
这种代码在“默认值处理”时很容易写出来。更稳的写法:
int b = a == null ? 0 : a;
7. Stream / Lambda 里隐式拆箱
List<Integer> list = Arrays.asList(1, 2, null, 4); int sum = list.stream().mapToInt(Integer::intValue).sum();
这里如果有 null,会直接空指针。
安全一点要先过滤:
int sum = list.stream()
.filter(Objects::nonNull)
.mapToInt(Integer::intValue)
.sum();
8. 状态字段来自数据库,直接 switch 或运算
Integer status = null;
switch (status) {
case 1 -> ...
}
这也会因为拆箱报错。
所以状态字段如果可能为 null,先判空再处理。
项目里几个实用的建议
- Long、Integer、Boolean 比较值时,优先用 Objects.equals(...)
- 状态判断常量写左边,比如:
Integer.valueOf(1).equals(status)
- Boolean 判断优先写:
Boolean.TRUE.equals(flag)
- 数据库可空字段,Java 实体尽量用包装类型,不要用基本类型
- 只要看到 == 1、== 0、if (flag),就要想一下会不会拆箱
到此这篇关于浅谈JAVA最常见的装箱/拆箱坑的文章就介绍到这了,更多相关JAVA 装箱/拆箱坑内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java图片处理 (文字水印、图片水印、缩放、补白)代码实例
这篇文章主要介绍了Java图片处理 (文字水印、图片水印、缩放、补白)代码实例,本文直接给出实现代码,需要的朋友可以参考下2015-06-06
Springboot 实现Server-Sent Events的项目实践
本文介绍了在Spring Boot中实现Server-Sent Events(SSE),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-12-12
基于IDEA,Eclipse搭建Spring Boot项目过程图解
这篇文章主要介绍了基于IDEA,Eclipse搭建Spring Boot项目过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-04-04
使用SpringMVC 重写、扩展HttpServletRequest请求参数
这篇文章主要介绍了使用SpringMVC 重写、扩展HttpServletRequest请求参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08
JAVA对象中使用 static 和 String 基础探究
这篇文章主要介绍了JAVA对象中使用static和String基础探究,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下2022-09-09
如何解决java:找不到符号符号:类__(使用了lombok的注解)
在使用IntelliJ IDEA开发Java项目时,可能遇到通过@lombok注解自动生成get和set方法不生效的问题,解决这一问题需要几个步骤,首先,确认Lombok插件已在IDEA中安装并启用,其次,确保项目中已添加Lombok的依赖,对于Maven和Gradle项目2024-10-10
IDEA下SpringBoot指定环境、配置文件启动操作过程
这篇文章主要介绍了IDEA下SpringBoot指定环境、配置文件启动过程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-08-08


最新评论