错误展示
异常定位
解决办法
1. 在访问成员之前检查对象是否为null
public class NullPointerExample {
public static void main(String[] args) {
String str = null;
if (str != null) {
int length = str.length();
} else {
System.out.println("str is null");
}
}
}
2. 使用Java 8的Optional类
import java.util.Optional;
public class NullPointerExample {
public static void main(String[] args) {
Optional<String> optionalStr = Optional.ofNullable(null);
optionalStr.ifPresent(str -> System.out.println(str.length()));
}
}
注意:虽然
Optional
可以帮助你更清晰地表达代码的意图,并减少空指针异常的风险,但它并不总是最佳解决方案。有时,简单的null检查就足够了,而且代码更简洁。
3. 使用注解进行空检查
可以使用像@Nullable
和@NotNull
这样的注解来标记可能为null或不为null的值。这些注解本身不会改变代码的执行,但它们可以为静态代码分析工具(如IntelliJ IDEA、SpotBugs等)提供信息,以帮助你在编译时检测到可能的空指针异常。
import org.jetbrains.annotations.Nullable;
public class NullPointerExample {
public static void main(String[] args) {
@Nullable String str = null;
int length = str.length(); // 这里静态代码分析工具会发出警告
}
}
其他空指针异常情况举例
1. 访问空对象的实例变量
public class Person {
public String name;
}
public class Example1 {
public static void main(String[] args) {
Person person = null;
System.out.println(person.name); // 这里会抛出 NullPointerException
}
}
2. 在数组中访问空元素
public class Example2 {
public static void main(String[] args) {
String[] strings = new String[5];
System.out.println(strings[0].length()); // 这里会抛出 NullPointerException,因为strings[0]是null
}
}
3. 自动拆箱导致的空指针异常
public class Example3 {
public static void main(String[] args) {
Integer num = null;
int primitiveNum = num; // 这里在自动拆箱时会抛出 NullPointerException
}
}
4. 链式调用中的空指针异常
public class Example4 {
public static void main(String[] args) {
String str = null;
boolean allMatch = str.substring(1).equals("all"); // 这里会抛出 NullPointerException,因为str是null
}
}
注意:在这个例子中,即使
substring()
调用没有问题(当然,在这个特定情况下它有问题,因为str
是null
),equals
方法调用也会在str.substring(1)
返回null
时抛出空指针异常。