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)

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

相关推荐
那我掉的头发算什么17 小时前
【Spring MVC】手动做出小网页的最后一步——学会SpringMVC响应
java·服务器·后端·spring·mvc
小楼v17 小时前
常见的java线程并发安全问题八股
java·后端·线程·并发安全
齐 飞17 小时前
springboot发送邮件
java·spring boot·后端
Hello eveybody17 小时前
Java发明者介绍
java·开发语言
Mr Xu_17 小时前
从零实战!使用 Mars3D 快速构建水利监测 WebGIS 系统
前端·3d·webgis
wuhen_n17 小时前
类型断言:as vs <> vs ! 的使用边界与陷阱
前端·javascript·typescript
⑩-17 小时前
VUE3-组件通信
前端·javascript·vue.js
哆啦A梦158817 小时前
Vue3魔法手册 作者 张天禹 02
前端·vue.js·typescript
Micro麦可乐17 小时前
最新Spring Security实战教程(十五)快速集成 GitHub 与 Gitee 的社交登录
java·spring boot·spring·gitee·github·spring security·社交登陆
u01040583617 小时前
企业微信会话存档API对接中的敏感信息审计日志架构(Java版)
java·架构·企业微信