Java里的空指针

空指针(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("触发索引越界:不是空指针!");
        }
    }
}

避坑小技巧

  1. 判空优先:用 Objects.isNull() / Objects.nonNull() 替代手动 == null ,更优雅且避免漏判;

  2. 拆箱前校验:包装类拆箱前先确认非 null ;

  3. 工具类兜底:字符串拼接用 String.join() ,集合判空用 CollectionUtils.isEmpty() (Apache Commons)。

空指针不可怕,只要摸清它的"藏身之处",提前设防就能轻松拿捏~

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商