什么是 NullPointerException?
NullPointerException
是 Java 中的一种运行时异常,表示程序试图对一个 null
对象执行某种操作时发生的错误。例如,访问一个为 null
的对象的方法或属性。
常见导致 NPE 的场景
以下是一些典型会导致 NPE 的代码示例:
-
调用一个为
null
的对象的方法:String str = null; str.length(); // 抛出 NullPointerException
-
访问一个为
null
的对象的字段:class Person { String name; } Person person = null; String name = person.name; // 抛出 NullPointerException
-
使用
null
作为数组对象:int[] array = null; int length = array.length; // 抛出 NullPointerException
-
自动拆箱时:
Integer num = null; int value = num; // 抛出 NullPointerException,因为自动拆箱 num.intValue() 被调用
-
在集合操作中:
Map<String, String> map = new HashMap<>(); String value = map.get("key"); // 如果 value 是 null,接下来对它调用方法可能导致 NPE value.toUpperCase(); // 抛出 NullPointerException
如何避免 NPE?
-
提前检查
null
: 使用显式的if
判断来检查变量是否为null
。if (str != null) { System.out.println(str.length()); }
-
使用
Optional
(Java 8 引入): 避免直接操作可能为null
的变量。Optional<String> optional = Optional.ofNullable(str); optional.ifPresent(s -> System.out.println(s.length()));
-
初始化变量: 在声明变量时就初始化,避免出现未赋值的
null
。String str = ""; // 空字符串而不是 null
-
使用
Objects.requireNonNull()
: 对关键变量进行非空检查,快速抛出异常。String str = Objects.requireNonNull(input, "Input cannot be null");
-
代码规范:
- 不要返回
null
,可以返回空集合、空字符串等替代。 - 避免链式调用(
a.b.c.d
),除非明确每一步都不可能为null
。
- 不要返回
-
@NonNull 注解(依赖工具): 借助工具(如 Lombok 或 IDE)自动检测和标注变量是否可以为
null
。
典型 NPE 错误的例子
假设你调用了一个 API,但返回值没有检查是否为 null
:
String value = someMethod(); // 返回值可能为 null
System.out.println(value.toUpperCase()); // 如果 value 为 null,这里会抛出 NPE
通过 null
检查修复:
String value = someMethod();
if (value != null) {
System.out.println(value.toUpperCase());
} else {
System.out.println("Value is null");
}
总结
NPE 是 Java 开发中非常常见的异常,但通过良好的编程习惯和工具的辅助,可以有效避免它的发生。关键是要对程序中可能为 null
的对象保持敏感,并进行适当的处理。