以下内容为:2025年8月13日重新更新整理
一、什么是 NullPointerException
?
java.lang.NullPointerException
是 Java 编程中最常见的异常之一,几乎所有 Java 开发者在开发程序(包括 Java Web 应用)时都曾遇到过。
它属于运行时异常(非受检异常),因此在代码中无需强制捕获,但需要通过编程技巧主动规避。
其核心触发场景是:尝试对一个值为 null
的对象执行操作(如调用方法、访问字段等)。
二、NullPointerException
的常见触发原因
以下是导致 NullPointerException
的典型场景,结合具体场景可快速定位问题:
-
调用
null
对象的实例方法
示例:String s = null; s.length();
(
s
为null
时调用length()
方法) -
访问或修改
null
对象的字段
示例:User u = null; int age = u.age;
(
u
为null
时访问age
字段) -
主动抛出
null
示例:throw null;
(直接抛出
null
会触发异常) -
操作
null
数组- 访问
null
数组的索引:int[] arr = null; int num = arr[0];
- 获取
null
数组的长度:int[] arr = null; int len = arr.length;
- 访问
-
在
null
对象上同步(synchronized
)
示例:Object lock = null; synchronized(lock) { ... }
(
lock
为null
时无法同步) -
方法参数传递
null
并执行操作
示例:public void print(String s) { System.out.println(s.toLowerCase()); }
(若传入
s = null
则触发异常) -
Web 应用中的隐藏场景
在 Java Web 开发中,NullPointerException
常导致 HTTP 500 错误(内部服务器错误)。例如 Spring MVC 中,若user.getUserId()
返回null
,则user.getUserId().toLowerCase()
会直接抛出异常。
三、NullPointerException
示例代码与解析
以下通过具体代码示例展示异常触发过程,帮助理解场景:
示例 1:调用 null
对象的方法
public class Temp {
public static void main(String[] args) {
Temp t = initT(); // initT() 返回 null
t.foo("Hi"); // 此处 t 为 null,调用 foo() 时抛出异常
}
private static Temp initT() { return null; }
public void foo(String s) { System.out.println(s.toLowerCase()); }
}
异常信息:
Exception in thread "main" java.lang.NullPointerException at Temp.main(Temp.java:7)
示例 2:访问 null
对象的字段
public class Temp {
public int x = 10;
public static void main(String[] args) {
Temp t = initT(); // initT() 返回 null
int i = t.x; // 此处 t 为 null,访问 x 时抛出异常
}
private static Temp initT() { return null; }
}
异常信息:
Exception in thread "main" java.lang.NullPointerException at Temp.main(Temp.java:9)
示例 3:操作 null
数组
public class Temp {
public static void main(String[] args) {
int[] data = null;
int len = data.length; // data 为 null,获取长度时抛出异常
}
}
异常信息:
Exception in thread "main" java.lang.NullPointerException at Temp.main(Temp.java:7)