空指针(NullPointerException)堪称Java程序员的"噩梦常客",尤其是进阶路上的新手,总被一些看似无害的代码突然"背刺"。今天揪出3个高频空指针场景,附避坑代码,让你精准避雷~
1. 字符串拼接的"隐形炸弹"
当你用 + 拼接字符串时,若其中一个对象为 null ,不会报错;但调用 String.concat() 方法时, null 参数直接触发空指针!
java
public class NullConcatTest {
public static void main(String[] args) {
String str1 = "掘金";
String str2 = null;
// + 拼接:自动将null转为"null"字符串,安全
System.out.println(str1 + str2); // 输出:掘金null
// concat()方法:参数为null直接抛空指针
try {
System.out.println(str1.concat(str2));
} catch (NullPointerException e) {
System.out.println("触发空指针:concat()不接受null参数");
}
}
}
2. 包装类拆箱的"暗箭"
包装类自动拆箱时,若包装类对象为 null ,会直接抛出空指针------因为拆箱本质是调用 xxxValue() 方法, null 调用方法必炸!
java
public class UnboxingNullTest {
public static void main(String[] args) {
Integer num = null;
// 自动拆箱:等价于num.intValue(),null调用方法触发空指针
try {
int result = num + 10;
} catch (NullPointerException e) {
System.out.println("触发空指针:包装类null不能拆箱");
}
}
}
3. 集合/数组的"越界+空值"双重坑
遍历集合时,若集合本身为 null ,调用 size() / get() 等方法直接空指针;若集合非空但索引越界,抛的是 IndexOutOfBoundsException ,别搞混!
java
import java.util.ArrayList;
import java.util.List;
public class CollectionNullTest {
public static void main(String[] args) {
List<String> list = null;
// 集合为null时调用size():空指针
try {
System.out.println(list.size());
} catch (NullPointerException e) {
System.out.println("触发空指针:null集合不能调用方法");
}
// 集合非空但索引越界:不是空指针,是索引越界
list = new ArrayList<>();
list.add("Java");
try {
System.out.println(list.get(1));
} catch (IndexOutOfBoundsException e) {
System.out.println("触发索引越界:不是空指针!");
}
}
}
避坑小技巧
-
判空优先:用
Objects.isNull() / Objects.nonNull()替代手动 == null ,更优雅且避免漏判; -
拆箱前校验:包装类拆箱前先确认非 null ;
-
工具类兜底:字符串拼接用
String.join(),集合判空用CollectionUtils.isEmpty() (Apache Commons)。
空指针不可怕,只要摸清它的"藏身之处",提前设防就能轻松拿捏~