Java NullPointerException 怎么解决
你有没有遇到过这种情况:写代码时明明逻辑没错,程序却突然弹出个红框,提示“NullPointerException”,直接把整个流程打断了?很多新手刚接触Java的时候,都被这个异常坑过——它不像语法错误那样容易定位,也不像逻辑错误那样有迹可循,就像个藏在代码里的“小幽灵”,突然冒出来捣乱。
先搞懂:NullPointerException到底是什么?
要解决问题,得先知道它从哪来。我们可以把Java里的变量比作“快递盒”:有的盒子里装着实实在在的东西(比如一杯奶茶、一本书),对应程序里的“非空对象”;有的盒子是空的,什么都没装,这就是“null”。当你对着空盒子伸手想拿东西时,自然会抓空,程序就会抛出NullPointerException。

举个生活化的例子:你给朋友发消息,想把刚买的奶茶照片发过去。如果手机里存了照片的链接(对应非空对象),一点就能打开;但如果链接输错了(对应变量存了null),你点“发送照片”的那一刻,就会弹出“找不到文件”的提示,这就是代码里的NullPointerException。
日常最容易踩的3个坑
知道了原理,就能避开大部分“幽灵”。这几个场景是新手的重灾区,你肯定也碰到过:
- 空字符串的判断误区:很多人写代码时,想判断用户输入的用户名是不是空,会写成
if(username == null),但如果用户输入了一串空格(比如输了好几个空格当用户名),username不是null,只是内容是空字符串,这时候程序还是会出问题,比如你想取用户名的长度username.length(),就会报错。 - 集合取元素的空判断:比如你用
List存了用户的订单,想取第一个订单的内容orderList.get(0),但如果用户没下过单,orderList就是空的,你再去取第0个元素,必然抓空。 - 对象属性的空引用:比如你有个
User对象,里面有Address属性,想拿用户的街道地址user.getAddress().getStreet(),但如果这个用户没填地址,user.getAddress()就是null,你再接着调用getStreet,就会触发异常。
招实用解法,看完就能用
碰到NullPointerException不用慌,这几个方法亲测有效,适合新手快速上手:
第一,给变量加“双重保险”判断:针对前面的空判断误区,判断一个字符串是否有效,要同时检查是否为null和内容是否为空,可以写成if(username != null && !username.trim().isEmpty())——先确认变量不是空盒子,再检查里面的内容,就不会抓空了。
第二,集合操作前先查空:用集合取元素前,先判断集合有没有东西,比如if(orderList != null && !orderList.isEmpty()),再去取get(0);如果集合本身是空的,直接给用户返回“暂无订单”的提示,程序就不会报错。
第三,多层属性用“空安全”处理:针对对象属性的空引用,Java 8之后提供了Optional类,就像给属性套了一层“防抓空的手套”。比如原来的写法会报错,改成Optional.ofNullable(user).map(User::getAddress).map(Address::getStreet).orElse("未填写地址"),不管user或者address是空的,都会返回默认地址,不会抛出异常。
只要养成“先判断、再使用”的小习惯,就能把这个藏在代码里的“小幽灵”挡在外面。下次再碰到NullPointerException,先看看是不是变量是空的,按照上面的方法排查,很快就能解决问题。