什么是 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 的对象保持敏感,并进行适当的处理。