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)

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

相关推荐
不懂的浪漫11 小时前
mqtt-plus 架构解析(五):错误处理与 ErrorAction 聚合策略
java·spring boot·后端·物联网·mqtt·架构
呼啦啦56111 小时前
C++vector
java·c++·缓存
花千树-01011 小时前
MCP + Function Calling:让模型自主驱动工具链完成多步推理
java·agent·react·mcp·toolcall·harness·j-langchain
Benszen11 小时前
Linux容器:轻量级虚拟化革命
java·linux·运维
dyb-dev11 小时前
我是如何学习 NestJS 的
前端·nestjs·全栈
凸头11 小时前
Lombok 包底层浅析
java
不懂的浪漫11 小时前
mqtt-plus 架构解析(三):Payload 序列化与反序列化,为什么要拆成两条链
java·spring boot·物联网·mqtt·架构
卷福同学11 小时前
去掉手机APP开屏广告,李跳跳2.2下载使用
java·后端·算法
kyriewen11 小时前
重排、重绘、合成:浏览器渲染的“三兄弟”,你惹不起也躲不过
前端·javascript·浏览器
NickJiangDev11 小时前
Elpis-Core 技术解析:从零构建一个基于 Koa 的企业级 Node.js 框架内核
前端