淺談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,所以更穩(wěn)的是:
Objects.equals(a, b)
這個坑在 Long id、Integer status 上特別常見。
2. 包裝類型和基本類型比較觸發(fā)拆箱,null 會空指針
Integer status = null;
if (status == 1) {
...
}
這會報 NullPointerException。 因為它會自動拆箱成:
status.intValue() == 1
更安全的寫法:
Integer.valueOf(1).equals(status)
或者:
Objects.equals(status, 1)
3. Boolean 當(dāng)成 boolean 用,null 會炸
Boolean deleted = null;
if (deleted) {
...
}
這也會空指針。因為 Java 會自動拆箱:
if (deleted.booleanValue()) {
...
}
安全寫法:
Boolean.TRUE.equals(deleted)
如果判斷 false:
Boolean.FALSE.equals(deleted)
這個在配置項、開關(guān)字段里特別常見。
4. 數(shù)據(jù)庫字段是 Integer / Long,直接賦給基本類型
Integer dbValue = null; int value = dbValue;
這會空指針,因為這里發(fā)生了拆箱。
正確做法:
int value = dbValue == null ? 0 : dbValue;
或者保持包裝類型:
Integer value = dbValue;
如果數(shù)據(jù)庫字段允許為空,Java 實體通常就應(yīng)該用包裝類型,不要用基本類型。
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。
這種代碼在“默認(rèn)值處理”時很容易寫出來。更穩(wěn)的寫法:
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. 狀態(tài)字段來自數(shù)據(jù)庫,直接 switch 或運算
Integer status = null;
switch (status) {
case 1 -> ...
}
這也會因為拆箱報錯。
所以狀態(tài)字段如果可能為 null,先判空再處理。
項目里幾個實用的建議
- Long、Integer、Boolean 比較值時,優(yōu)先用 Objects.equals(...)
- 狀態(tài)判斷常量寫左邊,比如:
Integer.valueOf(1).equals(status)
- Boolean 判斷優(yōu)先寫:
Boolean.TRUE.equals(flag)
- 數(shù)據(jù)庫可空字段,Java 實體盡量用包裝類型,不要用基本類型
- 只要看到 == 1、== 0、if (flag),就要想一下會不會拆箱
到此這篇關(guān)于淺談JAVA最常見的裝箱/拆箱坑的文章就介紹到這了,更多相關(guān)JAVA 裝箱/拆箱坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea?maven依賴引入失效無法正常導(dǎo)入依賴問題的解決方法
有時候idea導(dǎo)入一個新項目,或者pom文件修改(新增)了依賴,pom文件和代碼會報紅,提示依賴包不存在,下面這篇文章主要給大家介紹了關(guān)于idea?maven依賴引入失效無法正常導(dǎo)入依賴問題的解決方法,需要的朋友可以參考下2023-04-04
解決spring-data-jpa 事物中修改屬性自動更新update問題
這篇文章主要介紹了解決spring-data-jpa 事物中修改屬性自動更新update問題,具有很好的參考價值,希望對大家2021-08-08
Java SpringMVC 集成靜態(tài)資源的方式你了解嗎
本篇文章主要介紹了SpringMVC集成靜態(tài)資源的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-10-10
Spring Cloud Alibaba Nacos Config進階使用
這篇文章主要介紹了Spring Cloud Alibaba Nacos Config進階使用,文中使用企業(yè)案例,圖文并茂的展示了Nacos Config的使用,感興趣的小伙伴可以看一看2021-08-08

