解决NPE的三种方式

解决NPE的三种方式

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

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

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

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

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

方式一:If…else

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 -要描述的可能为空的值返回:如果指定的值是非空,则返回一个带有当前值的可选值,否则返回空可选

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断言的方式来防止空指针

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

在这里插入图片描述

Book book = new Book(1,"十万个为什么",25.6);// 可能发生异常的对象,提示信息
Assert.notNull(book,"书本信息不能为空!");
double price = book.getPrice();
System.out.println(price);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484174.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序

前言&#xff1a; 最近也是发现了一款特别好用的免费ONLYOFFICE 桌面应用程序忍不住分享给大家&#xff0c;这款编辑器能够打开、阅读和编辑多种文件类型&#xff0c;包括.docx文档、.pptx幻灯片和.xlsx表格等开放XML格式的Office文档。此外&#xff0c;ONLYOFFICE桌面编辑器还…

Linux环境安装Git(详细图文)

说明 此文档Linux环境为&#xff1a;Ubuntu 22.04&#xff0c;本文档介绍两种安装方式&#xff0c;一种是服务器能联网的情况通过yum或apt命令下载&#xff0c;第二种采用源码方式安装。 一、yum/apt方式安装 1.yum方式安装Git 如果你的服务器环境是centos/redhot&#xff…

Java Swing游戏开发学习2

跟随大佬教程继续&#xff0c;图片资源&#xff0c;视频简介有下载链接。 这个文章是看视频教程写的&#xff0c;不算原创。有条件的可以去油管搜索RyiSnow&#xff0c;是一个游戏开发视频制作up主&#xff0c;讲解的非常基础&#xff0c;可以边看边实践&#xff0c;增加对Java…

【EI会议征稿通知】第十届能源材料与环境工程国际学术会议(ICEMEE 2024)

第十届能源材料与环境工程国际学术会议&#xff08;ICEMEE 2024&#xff09; 2024 10th International Conference on Energy Materials and Environment Engineering 随着前9年的成功&#xff0c;ICEMEE在2024年迎来了第10届。很荣幸地宣布&#xff0c;第十届能源材料与环境…

Zabbix 6.2.1 安装

目录 1、监控介绍 监控的重要性 网站的可用性 监控范畴 如何监控 2、Zabbix 介绍 zabbix 简介 zabbix 主要功能 zabbix 监控范畴 Zabbix 监控组件 zabbix 常见进程 zabbix agentd 工作模式 zabbix 环境监控中概念 3、搭建LNMP 拓扑规划 安装MySQL 安装 Nginx …

怎么传输IT企业远程大量数据?

IT行业在远程数据传输方面面临着日益增长的需求。无论是进行项目合作、数据备份还是文件共享&#xff0c;远程传输大量数据已经成为日常工作的一个重要组成部分。然而&#xff0c;这一过程并非没有困难。在远程传输大量数据时&#xff0c;企业经常遇到传输速度缓慢、成本高昂以…

三、创建脚手架和脚手架分析

三、创建脚手架 一、环境准备 1、安装node.js **下载地址&#xff1a;**https://nodejs.org/zh-cn/界面展示 2、检查node.js版本 查看版本的两种方式 node -vnode -version 出现版本号则说明安装成功&#xff08;最新的以官网为准&#xff09; 3、为了提高我们的效率&…

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…

Linux中安装Nginx及日常配置使用

高性能的http服务器/反向代理服务器。官方测试支持5万并发&#xff0c;CPU、内存等消耗较低且运行稳定 使用场景 Http服务器。 Nginx可以单独提供Http服务&#xff0c;做为静态网页的服务器。虚拟主机。 可以在一台服务器虚拟出多个网站。反向代理与负载均衡。 Nginx做反向代理…

【Spring Cloud】实现微服务调用的负载均衡

文章目录 什么是负载均衡自定义实现负载均衡启动shop-product微服务通过nacos查看微服务的启动情况自定义实现负载均衡 基于Ribbon实现负载均衡添加注解修改服务调用的方法Ribbon支持的负载均衡策略通过修改配置来调整 Ribbon 的负载均衡策略通过注入Bean来调整 Ribbon 的负载均…

Shader基础的简单实现(基于URP渲染)

一个模型是很多个顶点组成&#xff0c;顶点数据中包含坐标、法线、切线、UV坐标、顶点颜色等等组成。 URP(Universal Render Pipeline)通用渲染管线&#xff0c;是Unity在2019.3版本之后推出的一种新的渲染管线。传统的渲染管线在渲染多光源的情况&#xff0c;是把每一个主要光…

由面试题“Redis是否为单线程”引发的思考

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…