如何避免或者减少线上空指针问题的发生

news2024/11/24 19:44:36

一、背景

在我们的日常工作中,我们会经常遇到空指针问题,理论上来说只是一个判段空指针的小问题,但是因为这行代码的报错,程序中断了后面的执行,可能导致整体业务逻辑受影响。那在工作中我们应该如何避免,或者说降低空指针的发生。下面讲一下我的个人感悟

二、如何避免或者减少空指针问题的发生

(1)使用对象时养成不信任意识

一定要记住无论用什么方法避免空指针,最好的手段永远是不信任意识,只有不信任意识养成了,我们在写代码的时候在用一个对象的时候,自然而然就会想到这个对象是否会为空,只有这层意识养成了,你才能避免绝大多数空指针场景

在这里将我们一般常用的对象总结一下

  • 自己手动new出来的对象
  • 从数据库查询数据转换出来的查询对象(一般是一个集合)
  • 框架(一般大家都是用Spring全家桶)帮我们创建的对象
  • 通过调用外部接口返回的数据形成的数据对象
  • .........

在我们使用对象的时候都要有不信任的意识,他是否为空对象,对象里面的对象是否为空对象。这样才能大概率避免空指针场景

(2)使用JDK1.8特性 Optional工具封装方法

Optional有两个用法

  • 封装方法返回值

我们来看这样一段方法

假设会员积分超过1000,则返回一台电脑,然后用电脑玩

/**
     * @author chen
     * @description 如果会员积分大于1000则奖励一台电脑
     * @param memberPointsNumber 会员积分
     * @date: 2024/8/6 11:06
     * @return bio.Computer
     */
    public Computer getComputer(int memberPointsNumber){
        if(memberPointsNumber < 1000){
            return null;
        }
        return new Computer();
    }

假设我们使用的时候是这样,直接调用,则就可能会出现空指针的现象,所以这个非常取决于调用者的意识,调用者意识好,会进行空指针判断,则可以避免

   Computer computer = testDemo.getComputer(800);
   //拿到这个对象直接判空则会引发空指针
   computer.doPlayGame();
Exception in thread "main" java.lang.NullPointerException
	at CopyArrayListDemo.main(CopyArrayListDemo.java:21)

我们可以使用Optional进行改进一下

/**
     * @author chen
     * @description 如果会员积分大于1000则奖励一台电脑
     * @param memberPointsNumber 会员积分
     * @date: 2024/8/6 11:06
     * @return bio.Computer
     */
    public Optional<Computer> getComputer(int memberPointsNumber){
        if(memberPointsNumber < 1000){
            return Optional.empty();
        }
        return Optional.of(new Computer());
    }

如果调用者不进行空判断,则IDEA会自己进行深颜色告警

所以我们正确的写法是,利用Optional的特性对使用对象进行检查,借助Optional特性让调用方强制检查,从而减少空指针的发生

    Optional<Computer> computerOptional = testDemo.getComputer(800);
    //使用Optional的特性进行判空
    if(!computerOptional.isPresent()) {
        return;
    }
    Computer computer = computerOptional.get();
    computer.doPlayGame();
  • 嵌套对象获取

在没使用Optional时,我们获取嵌套对象如果需要判空则需要这样做

举一个获取Computer类的USB类的版本号为例,需要获取对象判断空指针,如果对象嵌套层级深要判断多次空指针

        Computer computer = computerOptional.get();
        //获取USB对象
        USB usb = computer.getUsb();
        Integer version = 1;
        if(Objects.nonNull(usb)){
            version = usb.getVersion();
        }
        System.out.println("USB 版本号是 : " + version);

我们也可以使用Optional来这样写,代码更加简洁,以及工具会帮我们进行空指针判断

        Computer computer = computerOptional.get();
        //使用Optional来进行获取版本号,简化代码的同时以及能做到空指针判断
        Integer version = Optional.of(computer).map(Computer::getUsb).map(USB::getVersion).orElse(1);
        System.out.println("USB 版本号是 : " + version);

(3)使用Hutool转换类进行转换

在我们的工作中,数据转换是我们常常会遇见的,例如String转Integer,Integer转Double等等,Hutool工具包里面帮我们提供了工具类转换,即使转换失败也不会报错,可以大大提高代码的健壮性,举String转Integer为例

我们一般这样写,代码存在风险,Integer.parseInt方法不会判空,如果字符串不是数字也会报错

        String a = "123";
        //Integer.parseInt方法不会判空,如果字符串不是数字也会报错
        Integer result = Integer.parseInt(a);

假设我们使用hutool工具包提供的类,代码很稳定,即使变量a是非数字也不会报错,转换的api也很丰富,也支持转换失败返回默认值,具体可以去hutool工具官网上了解

类型转换工具类-Convert | Hutool

        String a = "123";
        Integer result = Convert.toInt(a);

(4)代码扫描工具

代码扫描工具很多公司都是自己搭建的,这个不详细说了,比较火的有FindBugs、PMD、SonarQube、Fortify、WebInspect,对于一些常规的空指针错误是能够帮你扫描出来的,也算是减少或者避免空指针问题的工具

三、总结

任何工具都是辅助,就像我之前说的,只有不信任意识才是最终的道路,可以结合工具,然后逐步养成不信任意识,在写代码的道路上越来越严谨,出问题的概率当然就越来越小。祝愿大家写的代码越来越越稳如泰山。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

layer.load 加倒计时

实现效果 loadinglayer.load(1, {content:"",shade: [0.7, #333],time:5000,success: function(layero,index) {var i 5;var timer null;var fn function() {// 显示的提示layero.find(".layui-layer-content").html(正在连接&#xff0c;请稍等&…

谷歌突然停止为应用程序生成胖APK 只提供AAB包可能会影响用户侧载安装

谷歌最初是在 2018 年开始准备 Android App Bundle (即 AAB) 安装包&#xff0c;到 2021 年这种格式已经成为默认格式&#xff0c;开发者在提交应用程序时需要将其构建为 AAB 格式方便 Google Play 应用商店分发。 AAB 格式的优势在于适用于不同屏幕尺寸、语言、CPU 架构和 An…

js基础与判断

1.加减乘除 2.逻辑运算符 4.分支 5.swicth switch与if-else区别 6.break和continue

Python list加了类型推断运行报错,TypeError: ‘type‘ object is not subscriptable,python3.7

问题描述&#xff1a; 在python3.7 版本 运行代码&#xff0c;报错 def retry( ignore_exception_type_info_list:list[IgnoreExceptionInfo]None):>>> TypeError: type object is not subscriptable解决方案&#xff1a; 去掉list内的参数推断,就正常了&#xff0…

Linux 操作系统速通

一、安装虚拟机 1. VmWare 安装下载 vmware workstation pro 16 下载 win R 输入 ncpa.cpl 确保网卡正常 2. CentOS 系统下载 CentOS 系统下载 将 CentOS 系统安装到虚拟机 3. 查看虚拟机 IP 命令 ifconfig 4. finalShell 安装下载 finalShell 下载 输入用户名一般是 ro…

高标准农田监测设备—农田环境的实时监测和精准管理

TH-Q3高标准农田监测设备是现代农业生产中不可或缺的重要工具&#xff0c;它们通过集成物联网、大数据、人工智能等先进技术&#xff0c;实现了对农田环境的实时监测和精准管理。以下是对高标准农田监测设备的详细介绍&#xff1a; 设备组成 高标准农田监测设备通常由多个子系统…

出现 No mapping for DELETE/GET等

出现 No mapping for DELETE/GET等 错误一&#xff1a;请求url不对 修改前 如下图可知后端请求url为http://localhost:8080/user/addressBook 运行后控制台出现 发现后端请求url比前端请求url少了/ 改正&#xff1a; 在DeleteMapping后面加上 / DeleteMapping("/&quo…

欧科云链对话香港大学、零壹智库:监管加速,市场增长何时就位?

香港Web3行业近期在广泛讨论一个话题——稳定币。它是虚拟资产和Web3市场的重要分支&#xff0c;也是连接传统金融与虚拟资产市场重要的“桥梁”。随着全球Web3 合规进程加速&#xff0c;各国也在积极推进本土稳定币监管及发展&#xff0c;稳定币市场格局正在迎来变革。近日&am…

堆排序以及向上、向下调整算法的时间复杂度推导及实现(超详细)

什么是堆排序&#xff1f; 堆排序是由堆这种数据结构所设计的一种排序算法 堆的分类&#xff1a; 大根堆&#xff1a;每个父结点的值都大于子结点 小根堆 &#xff1a;每个父结点的值都小于子结点 在了解完堆之后&#xff0c;需要先了解建堆&#xff0c;建堆有向上建堆建大…

JavaWeb——CSS的使用

CSS 层叠样式表(英文全称:(cascading stle sheets)能够对网页中元素位置的排版进行像素级精确控制&#xff0c;支持几乎所有的字体字号样式&#xff0c;拥有对网页对象和模型样式编辑的能力,简单来说,CSS用来美化页面 一、CSS的引入方式: 1.行内式&#xff1a;通过元素开始标…

清除 Nuxt 数据缓存:clearNuxtData

title: 清除 Nuxt 数据缓存&#xff1a;clearNuxtData date: 2024/8/6 updated: 2024/8/6 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt.js框架中的clearNuxtData方法&#xff0c;用于清除useAsyncData和useFetch缓存的数据、错误状态和待处理promises&am…

Sentine 源码分析之--AuthoritySlot、SystemSlot、GatewayFlowSlot

前言&#xff1a; 上一篇我对 Sentinel 中统计数据部分的 NodeSelectorSlot、ClusterBuilderSlot、StatisticSlot 的相关源码进行了分析&#xff0c;本篇我们开始分析规则相关的源码。 Sentinel 系列文章传送门&#xff1a; Sentinel 初步认识及使用 Sentinel 核心概念和工…

国家机构选用NAS存储的要求是什么?

西北航天基地采用Infortrend NAS存储做影视后期及共享 国家机构航天基地每天都有升空任务&#xff0c;记录下的视频数据分发给对应的项目组的NAS存储设备上&#xff0c;方便每个项目组做分析总结、对外宣传及学术交流的使用需求&#xff0c;因此选用了Infortrend桌面级NAS存储…

数据采集器与条码扫描器的区别

在条码二维码的应用领域中&#xff0c;数据采集器和条码扫描器是其应用过程两种核心硬件设备&#xff0c;均具备独特的功能与应用场景&#xff0c;您是否真正了解数据采集器和条码扫描器之间的细微差别&#xff1f;这一区别对于您的项目开发成本和工作效率提升有着至关重要的影…

VM16中安装Linux虚拟机

VM16下安装Linux虚拟机 注意这里只安装虚拟机&#xff0c;并没有按照Linux操作系统&#xff0c;按装操作系统请看后续文章 点击“创建新的虚拟机” 选择自定义创建虚拟机 选择虚拟机的硬件兼容性 暂时不选择系统镜像文件我们选择稍后安装 选择操作系统类型和版本 命…

PEER:基于高效专家检索的Transformer模型扩展新方法

谷歌DeepMind提出了一种名为PEER的参数高效专家检索机制&#xff0c;利用产品密钥技术从超过百万个微型专家库中进行稀疏检索&#xff0c;从而提高模型效率和性能&#xff0c;有效解决了Transformer模型规模扩展带来的计算挑战。 论文介绍 在 Transformer 架构中&#xff0c;计…

ADC的一些细节2

一&#xff0c;转换时间 ADC 是挂载在 APB2 总线&#xff08;PCLK2&#xff09;上的&#xff0c;经过分频器得到 ADC 时钟&#xff08;ADCCLK&#xff09;&#xff0c;最高 14 MHz。 转换时间采样时间12.5个周期 12.5个周期是固定的&#xff0c;一般我们设置 PCLK272M&#x…

基于CentOS Stream 9平台搭建Nacos2.4.0.1集群,并使用OpenResty反向代理集群

目录展示 Nacos2.4.0.1集群搭建1. 下载2. 解压3.修改配置3.1分别修改下启动类中JDK路径以及启动大小3.2 分别配置数据源 修改端口去掉前面的#注释&#xff08;修改数据库地址、数据库用户名、密码&#xff09;If use MySQL as datasource:Count of DB:Connect URL of DB:密钥鉴…

空气质量传感器 - 从零开始认识各种传感器【第二十八期】

空气质量传感器|从零开始认识各种传感器 1、什么是空气质量传感器&#xff1f; 空气质量传感器是一种检测空气中污染物浓度的设备&#xff0c;广泛应用于环境监测、智能家居、工业控制和健康管理等领域。 2、空气质量传感器是如何工作的&#xff1f; 对于每个人都关心的空气质…

java学习day17MyBatis

Mybatis 数据持久化是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中数据模型的统称。例如&#xff0c;文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作 MyBatis支持定制化SQL、存储过程以及高级映射&#xff0c;可以在实体类和…