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)。

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

相关推荐
FRing0321 分钟前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
kyriewen3 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
海的透彻3 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
IT_陈寒3 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
code2cat3 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
工控丫丫3 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
后台模板学习4 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one4 小时前
算法--构造
java·数据结构·算法
jerrywus4 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude
SL_staff4 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈