Java 如何避免空指针异常?

2025 年 3 月 28 日 | 阅读 4 分钟

空指针异常 (Null Pointer Exception) 是一种运行时异常,当 Java 程序尝试使用一个值为 null 的对象引用时,就会抛出该异常。空指针异常可能在以下几种情况下发生:

1. 使用 null 对象调用方法

如果我们在一个 null 对象上调用某个方法,Java 程序会抛出 NullPointerException。考虑以下示例。

输出

Exception in thread "main" java.lang.NullPointerException: 	Cannot invoke "DummyClass.convert(String)" because "dummy" 	is null
at DummyClass.main(DummyClass.java:14)

2. 程序尝试修改 null 对象的字段

如果我们尝试修改一个 null 对象的字段,也可能抛出空指针异常。考虑以下示例。

输出

Exception in thread "main" java.lang.NullPointerException: 	Cannot read field "num" because "dummy" is null
at DummyClass.main(DummyClass.java:10)

3. 将 null 参数传递给方法

如果我们不对方法的参数进行 null 值检查,就可能发生空指针异常。考虑以下示例。

输出

Exception in thread "main" java.lang.NullPointerException: 	Cannot invoke "String.toUpperCase()" because "s" is null
at DummyClass.convert(DummyClass.java:4)
at DummyClass.main(DummyClass.java:9)

4. 尝试操作一个 null 的数组对象

如果我们尝试对一个 null 数组执行操作,则会抛出空指针异常。考虑以下示例。

输出

Exception in thread "main" java.lang.NullPointerException: Cannot read the array length because "dummy.arr" is null
at DummyClass.main(DummyClass.java:7)

5. 尝试对 null 对象进行同步

当我们需要为并发访问同步方法或块时,必须检查用于同步的对象引用是否为 null。考虑以下示例。

输出

Exception in thread "main" java.lang.NullPointerException: Cannot enter synchronized block because "DummyClass.var" is null
at DummyClass.main(DummyClass.java:6)

避免空指针异常一直是 Java 开发者的一个重要任务。许多编程语言提供了检查空指针异常的方法。然而,Java 本身并没有提供这样的内置方法。

为了避免空指针异常,我们需要确保所有对象在使用前都已初始化为合法值。我们必须在定义引用变量时就进行验证,确保它不是 null,因为对 null 引用变量执行任何操作都会导致空指针异常。

处理空指针异常时,我们需要考虑以下几种情况:

字符串比较

当我们将字符串与字面量进行比较时,如果我们要比较的字符串对象为 null,则可能会遇到空指针异常。考虑以下示例。

输出

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "str" is null
at StringCompare.main(StringCompare.java:7)

上面的示例将抛出空指针异常,因为调用 equals() 方法的字符串对象为 null。然而,如果我们调用 String 字面量(其值已知)上的 equals() 方法,而不是 String 对象,就可以避免这种情况。考虑以下示例,它不会抛出空指针异常。

输出

Different Objects

使用三元运算符

我们还可以使用三元运算符来避免空指针异常。我们可以使用三元运算符进行检查。我们检查布尔表达式,如果表达式为真则返回值 1;否则,返回值 2。

请看以下示例。

输出

null value
Javatpoint JTP

在上面的示例中,如果字符串对象为 null,则 msg 将为 null 值;否则,它将打印实际的字符串。

检查方法的参数

我们可以在执行方法体之前检查方法的参数是否为 null。考虑以下示例,当传递给方法的参数无效时,它会抛出 IllegalArgumentException。

输出

IllegalArgumentException caught
50