空指针异常(NullPointException,简称 NPE)
1 )返回类型为基本数据类型,而return包装数据类型的对象时,自动拆箱就有可能产生NPE。
public int f() {
return Integer对象; // 如果为null,因为自动拆箱所以会抛NPE。
}
2 ) 数据库的查询结果可能为null。因此所有的POJO类属性必须使用包装数据类型。 3 ) 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。 4 ) 远程调用返回对象时,一律要求进行空指针判断,防止NPE。 5 ) 对于Session中获取的数据,建议NPE检查,避免空指针。 6 ) 级联调用obj.getA().getB().getC();一连串调用,易产生NPE。
使用JDK8的Optional类来防止NPE问题
Optional 类可以让我们以函数式编程的方式处理 null 值,抛弃了 Java 8 之前需要嵌套大量 if-else 代码块,使代码可读性有了很大的提高,但是应尽量避免使用 Optional 类型声明实体类的属性
使用Optional类的主要目的是在可能为null的值上进行操作时提供一种安全的方式,而不是直接使用null
- 使用Optional的工厂方法创建Optional对象:这样可以将一个可能为null的值包装到Optional对象中。
Optional<String> optionalValue = Optional.ofNullable(value);
- 使用Optional的方法来处理Optional对象:使用
ifPresent
方法可以在Optional对象存在值的情况下执行一些操作。这样可以避免使用null进行操作时的NPE。
Optional<String> optionalValue = Optional.ofNullable(value);
optionalValue.ifPresent(val -> System.out.println(val));
- 使用orElse方法提供默认值:使用
orElse
方法可以在Optional对象为空时提供一个默认值。
Optional<String> optionalValue = Optional.ofNullable(value);
String result = optionalValue.orElse("Default value");
- 使用orElseThrow方法抛出异常:使用
orElseThrow
方法可以在Optional对象为空时抛出指定的异常。Optional<String> optionalValue = Optional.ofNullable(value); String result = optionalValue.orElseThrow(() -> new RuntimeException("Value is null"));
例子
public class OptionalExample {
public static void main(String[] args) {
String value = null; // 假设这是一个可能为null的值
// 使用Optional的工厂方法创建Optional对象
Optional<String> optionalValue = Optional.ofNullable(value);
// 使用ifPresent方法执行操作,避免NPE
optionalValue.ifPresent(val -> System.out.println("Value: " + val));
// 使用orElse提供默认值
String result = optionalValue.orElse("Default value");
System.out.println("Result: " + result);
// 使用orElseThrow抛出异常
try {
String result2 = optionalValue.orElseThrow(() -> new RuntimeException("Value is null"));
System.out.println("Result 2: " + result2);
} catch (RuntimeException e) {
System.out.println("Exception: " + e.getMessage());
}
}
}