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 小时前
【安装配置教程】在linux部署java项目
java·linux·intellij-idea·jar
时72 小时前
PDF.js 在 Vue 中的使用指南
前端
虎子_layor2 小时前
Spring 循环依赖与三级缓存:我终于敢说把这事儿讲透了
java·后端·spring
鹘一2 小时前
Prompts 组件实现
前端·javascript
大菜菜2 小时前
Molecule Framework - ExplorerService API 详细文档
前端
better_liang2 小时前
每日Java面试场景题知识点之-单例模式
java·单例模式·设计模式·面试·企业级开发
_一两风2 小时前
Vue-TodoList 项目详解
前端·javascript·vue.js
北辰alk2 小时前
Vue中mixin与mixins:全面解析与实战指南
前端·vue.js
okseekw2 小时前
递归:不止是 “自己调用自己”,看完这篇秒懂
java·后端