解决NPE的三种方式

解决NPE的三种方式

NullPointerException(空指针异常,NPE)是Java编程中常见的错误。解决NPE的方法可以从以下三个方面考虑:

  1. 明确处理空引用情况:

    在某些情况下,无法避免使用可能为空的引用对象。此时,需要明确处理空引用情况,以避免抛出NPE。可以使用条件判断,例如使用if-else语句或者三元运算符来处理空引用情况,确保不会对空引用执行操作。

  2. 避免使用空引用:

    在编写代码时,应该尽量避免使用可能为空的引用对象。在使用之前,要确保引用对象不为空,可以通过条件判断、空引用检查或者使用Optional类来处理可能为空的情况。

  3. 使用断言进行检查:

    断言是一种在编码期间进行验证的机制。可以使用断言来检查引用对象是否为空,并及时发现潜在的NPE问题。当程序运行到断言语句时,如果断言条件不满足,将会触发AssertionError异常。使用断言可以帮助我们在调试和开发期间快速定位和解决空引用问题。

对于NPE问题,及时的错误定位和修复非常重要。合理地使用以上三种方式,可以在代码编写和调试过程中有效预防和解决NPE问题。

方式一:If...else

java 复制代码
public static void main(String[] args) {

	// Book book = new Book(1,"十万个为什么",25.6);
	Book book = null;
	if (book != null) {
		double price = book.getPrice();
		System.out.println(price);
	} else {
		System.out.println("null");
	}
}
输出结果为:null

方式二:Optional

OfNullable:如果非空,则返回一个描述指定值的Optional,否则返回一个空的Optional。参数:value -要描述的可能为空的值返回:如果指定的值是非空,则返回一个带有当前值的可选值,否则返回空可选

java 复制代码
public static void main(String[] args) {

	Book book = new Book(1,"十万个为什么",25.6);
	// Book book = null;
	Optional<Book> bookOptional = Optional.ofNullable(book);
	System.out.println(bookOptional);
	
	// 在判断Optional对象是否为空之前会先执行orElse()方法,如果orElse方法的传参是一个函数,那么就会先执行该函数,
	// Double price = bookOptional.map(Book::getPrice).orElse(getBookPrice());
	Double price = bookOptional.map(Book::getPrice).orElse(getBookPrice());
	System.out.println(price);
}
	
public static double getBookPrice() {
	System.out.println("这里进行了其他操作");
	return 9.9;
}

如果orElse方法中传的是一个参数,那没有问题,当传的参数是一个函数时就出现问题了。当使用orElse方法时,不管Optional对象是否为空,在这之前都先执行该方法。

当我们的对象不为空时,预期结果是直接拿到数值,并打印出来,但是使用orElse并传入一个函数时就会出现如下结果:

我们的预期是当Optional对象为空时再执行后面的方法,所以这时候我们就可以用orElseGet()方法来实现:

复制代码
Double aDouble = bookOptional.map(Book::getPrice).orElseGet(() -> getBookPrice());
System.out.println(aDouble);

对象不为空时:

对象为空时:

方式三:Assert

使用Assert断言的方式来防止空指针

java 复制代码
Book book = null;
// 可能发生异常的对象,提示信息
Assert.notNull(book,"书本信息不能为空!");
double price = book.getPrice();

System.out.println(price);
java 复制代码
Book book = new Book(1,"十万个为什么",25.6);

// 可能发生异常的对象,提示信息
Assert.notNull(book,"书本信息不能为空!");
double price = book.getPrice();
System.out.println(price);
相关推荐
柯南二号1 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
桦说编程8 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen8 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研8 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员9 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋9 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国10 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~10 小时前
《设计模式》装饰模式
java·设计模式
A尘埃10 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交10 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图