Java空指针异常NullPointerException怎么排查(含可运行示例)
Java空指针异常NullPointerException怎么排查(含可运行示例)
本文整理Java 空指针异常(NPE)的排查思路与可运行示例,适合课程设计、实验调试时查阅。
写 Java 作业时最怕啥?十有八九是看到那行红字NullPointerException(简称 NPE)。别慌,这玩意儿我大一也被折磨过,后来发现只要知道套路,排查起来其实不难。今天手把手带你走一遍。
排查思路(4 步走)
- 看报错行号:控制台会告诉你
at YourClass.java:15,直接定位到第 15 行。别从头读代码,先看那一行。 - 检查对象是否初始化:NPE 的本质是调用了一个
null对象的方法或属性。常见场景:变量只声明没赋值、方法返回了null、从数组或集合里取到了null。 - 用打印或断点确认:在可疑行前加
System.out.println(变量),看哪个变量是null。IDEA 的话可以双击行号打红点,Debug 模式运行,鼠标悬停看变量值。 - 查链式调用:比如
obj.getA().getB().toString(),只要某一个环节是null,整条链就炸。建议拆开写,或者加判空。
示例代码演示
下面用一个学生成绩查询的例子,模拟最常见的几种 NPE 情况。
importjava.util.*;publicclassNullPointerDemo{// 模拟一个可能返回 null 的方法publicstaticStringgetStudentName(Map<String,String>map,Stringid){returnmap.get(id);// 如果 id 不存在,返回 null}publicstaticvoidmain(String[]args){// 场景1:对象未初始化Stringname=null;// System.out.println(name.length()); // 这里会 NPE,先注释掉// 场景2:从 Map 取 null 后调用方法Map<String,String>studentMap=newHashMap<>();studentMap.put("001","小明");Stringresult=getStudentName(studentMap,"002");// "002" 不存在// System.out.println(result.toUpperCase()); // 这里会 NPE,因为 result 是 null// 场景3:数组或集合里的 nullString[]students=newString[3];students[0]="小红";students[1]=null;// 故意留一个 nullstudents[2]="小刚";for(Strings:students){// System.out.println(s.length()); // 遍历到 students[1] 时 NPE}// 场景4:链式调用List<String>list=null;// System.out.println(list.size()); // 直接 NPE// 正确的处理方式:加判空StringsafeResult=getStudentName(studentMap,"002");if(safeResult!=null){System.out.println(safeResult.toUpperCase());}else{System.out.println("学生不存在");}// 用 Optional 更优雅(Java 8+)Optional<String>optionalResult=Optional.ofNullable(getStudentName(studentMap,"002"));optionalResult.ifPresentOrElse(s->System.out.println(s.toUpperCase()),()->System.out.println("学生不存在"));// 使用三元运算符StringfinalName=(safeResult!=null)?safeResult:"默认值";System.out.println("最终名字:"+finalName);}}常见踩坑点
- 方法返回值没判空:比如
findUserById(id)返回null,你直接.getName()就炸。 - JSON 解析:从接口拿数据,某个字段是
null,你直接getString("key").length()。 - 数据库查询:
resultSet.getString("col")可能为null,尤其联合查询时。 - 构造器里漏初始化:成员变量声明了但没在构造方法里赋值,后续方法一调用就 NPE。
- 自动拆箱:
Integer为null时参与运算,也会触发 NPE,作业里很常见。
本地怎么跑
- 把上面代码保存为
NullPointerDemo.java。 - 命令行执行
javac NullPointerDemo.java && java NullPointerDemo。 - 逐行取消注释带 NPE 的
System.out.println,观察控制台行号变化。 - 对照「排查思路」四步,练习从报错行反推哪个变量是
null。
我的建议
写代码时养成习惯:谁调用谁负责判空。方法里如果可能返回null,最好在注释里说明,或者用@Nullable注解标记。实在嫌麻烦,就用Objects.requireNonNull()主动抛出异常,这样报错信息更明确。
