0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

NullPointerException及其产生的场景

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-09 17:14 次阅读

如果一个Java程序到处抛出NullPointerException,那么我们可能会各种吐槽代码的质量。但是我们的项目又经常会抛出空指针异常,空指针异常必然常伴Java程序员。为此我们需要了解一些它喽,NullPointerException是Java中一个常见的RuntimeException,正如阿里的Java开发手册所说,对于Java程序员来说防止NPE是一种基本素养。今天我们盘一下NullPointerException。

1 NullPointerException以及其产生的场景

Java中定义:在应用程序中尝试使用null时会抛出异常。

其中以下的情况会产生NullPointerException

  1. 调用空对象的方法,
  2. 访问或者修改对象的字段值时
  3. 获取一个空对象(数组)的长度时,
  4. 修改或者回取null数组的一个元素或者值时
  5. 抛出异常时,抛出null。

以上是针对各种具体发生异常的情况,而对于日常使用过程中,可能抛出空指针异常的情景非常多,我们常用的手册中提到了以下几种NPE产生的实际使用场景。

  • 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE。
  • 数据库的查询结果可能为null。
  • 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。
  • 远程调用返回对象时,一律要求进行空指针判断,防止NPE。
  • 对于Session中获取的数据,建议进行NPE检查,避免空指针。
  • 级联调用obj.getA().getB().getC();一连串调用,易产生NPE。

自动拆箱的NPE

如下代码中,代码逻辑出现问题的话,返回就是null。

public int count(){
    Integer integer = null;
    。。。。。。
    return integer;
}

同理如下代码也是同样的问题,均属于自动拆装箱时的NPE问题。

public static Boolean callSuccess(){
    return null;

};

从集合取出的值直接使用会遇到NPE.

Map< String,String > map= new HashMap<  >();
map.get("test").equals("test");

2 NPE处理以及如何避免

一般程序中需要处理NPE的地方随处可见,常见的NPE预防介绍如下几种方法。

2.1 如果是链式get这种推荐使用Optional进行处理

如下代码

public class Department {
    private String departmentName;
    private Company company;
    ...
}
public class Group {
    private Department department;
    ...
}
public class Employee {
    private String staffName;
    private Group group;
    ...
}

如果程序中需要如此调用

employee.getGroup().getDepartment().getDepartmentName();

那么每一处均可能出现NullPointerException,如果我们写成下面这样。

if (employee != null){
    if(employee.getGroup() != null){
        if(employee.getGroup().getDepartment() != null){
            String departmentName =    employee.getGroup().getDepartment().getDepartmentName();
        }
    }
}

if嵌套大军来袭,尔等还不下马受死。

上述if嵌套看起来的确很不美观,使用Optional可以比较容易的避免这些if判断,代码也会优雅不少。

下面不管哪一层为null返回均为Default。

String s = Optional.ofNullable(employee)
        .map(Employee::getGroup)
        .map(Group::getDepartment)
        .map(Department::getDepartmentName).orElse("Default");

或者使用如下方法,如果某一层为null则返回Supplier的执行结果。

String s1 = Optional.ofNullable(employee)
        .map(Employee::getGroup)
        .map(Group::getDepartment)
        .map(Department::getDepartmentName).orElseGet(() - > {
            return "Supplier default";
        });

2.2 主动进行参数检查,对方法中传入的参数进行检验

大部分的源码中使用的基础检查均会检查null

public static String testString(String str) throws Exception {
    if (str == null){
        throw new Exception("param can't be null");
    }
    return str;
}

2.3 在已知字符串上使用equals(),equalsIgnoreCase()等方法。

"knownObject".equals(unknownObject)

2.4 尽量避免方法中返回null

一些返回数组或者List的方法,如果没有值,尽量返回空集合,避免返回null。

2.5 新版本中Java输出的NullPointException详细信息

Java14 可以使用增强异常信息来查看NullPointerException的详细错误信息。Java17已经默认开启。

java -XX:+ShowCodeDetailsInExceptionMessages NPTDemo

使用Java17执行如下语句及NullPointException的输出

Map< String,String > map= new HashMap<  >();
map.get("test").equals("test");
E:Javajdk-17.0.1bin >java NPTDemo
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because the return value of "java.util.Map.get(Object)" is null
        at NPTDemo.main(NPTDemo.java:24)
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6599

    浏览量

    87970
  • 代码
    +关注

    关注

    30

    文章

    4603

    浏览量

    67390
  • 应用程序
    +关注

    关注

    37

    文章

    3172

    浏览量

    57099
  • null
    +关注

    关注

    0

    文章

    17

    浏览量

    3863
收藏 人收藏

    评论

    相关推荐

    PCBA焊点气泡的危害及其产生原因分析

    PCBA焊点气泡(空洞)的危害及其产生原因分析
    的头像 发表于 01-05 14:18 1057次阅读
    PCBA焊点气泡的危害<b class='flag-5'>及其</b><b class='flag-5'>产生</b>原因分析

    阐述BUCK电路损耗产生及其估算算法

    PART1:前言本文以一个12V-2.5V/2A的DC-DC电源为例,阐述BUCK电路损耗产生及其估算算法。先做以下几点声明:1、开关电源的主功率开关管的工作区域:开区和关区,实际上是线性区
    发表于 07-27 07:55

    STM32的SPWM产生的原理及其过程是怎样的

    SPWM的原理和调制方法是什么?STM32的SPWM产生的原理及其过程是怎样的?
    发表于 02-17 07:15

    是否有任何针对 EVK 的测试套件或针对各种平台及其相关场景的各自出厂配置值?

    对于各种 IMX 系列处理器 (IMX 3/5/6),在 SD/MNC 主机控制器中可以实现的最大有效吞吐量是多少? 是否有任何针对 EVK 的测试套件或针对各种平台及其相关场景的各自出厂配置值?
    发表于 06-05 06:27

    超结理论的产生与发展及其对高压MOSFET器件设计的影响

    摘 要: 对超结理论的产生背景及其发展过程进行了介绍。以应用超结理论的COOLMOSTM 器件为例,介绍了超结器件的工作原理、存在的缺点以及提出的改进方法;并对其他基于超结
    发表于 11-14 15:32 0次下载

    风暖加热器油烟味产生的原因及其改进方法

    简要介绍风暖加热器油烟味产生的原因及其改进方法。关键词: 加热器; 油烟味; 产生原因; 改进方法Abstract: The author briefly introduces the causes that the heate
    发表于 07-25 09:40 22次下载

    超结理论的产生与发展及其对高压MOSFET器件设计的影响

    超结理论的产生与发展及其对高压MOSFET器件设计的影响:对超结理论的产生背景及其发展过程进行了介绍。以应用超结理论的COOLMOSTM 器件为例,介绍了超结器件的工作原理、存在的缺
    发表于 12-13 19:57 31次下载

    缓慢加灯丝技术的应用及其产生的经济效益

    缓慢加灯丝技术的应用及其产生的经济效益:对于使用大功率电子管发射台来讲,由于电子管的特点是功率大、线性好。但是它的不足是耗电量大,使用寿命短,价格昂贵。往往一
    发表于 12-15 10:21 19次下载

    脉冲产生和整形电路典型例题及其讲解

    脉冲产生和整形电路典型例题及其讲解 例6.1 用集成芯片555构成的施密特触发器电路及输入波形Vi如图6.3(a、b)所示,试画出对应的输出波形Vo
    发表于 04-22 16:53 42次下载

    脉冲超声波的产生及其特点

    脉冲超声波的产生及其特点 用于产生和接收超声波的材料一
    发表于 11-24 14:53 7452次阅读
    脉冲超声波的<b class='flag-5'>产生</b><b class='flag-5'>及其</b>特点

    谐波的产生原因及其危害介绍

    谐波的产生及其危害介绍 一、概述    在理想的情况下,优质的电力供应应该提供具有正弦波形的电压。但在实际中供电电压的波形会由于某些原因而偏离正弦波形
    发表于 04-08 17:44 1.4w次阅读

    高频开关电源中EMI产生的机理及其抑制方法

    本文从开关电源的电路结构、器件进行分析,探讨了电磁干扰产生的机理及其抑制方法。
    发表于 07-12 15:10 4551次阅读
    高频开关电源中EMI<b class='flag-5'>产生</b>的机理<b class='flag-5'>及其</b>抑制方法

    永磁同步电机直接转矩控制转矩脉动的产生及其抑制方法综述

    永磁同步电机直接转矩控制转矩脉动的产生及其抑制方法综述
    发表于 01-21 12:00 2次下载

    Java14处理NullPointerException新方式

    1.传统的 NullPointerException 2.增强型 NullPointerException 2.1 详细的异常信息 3. 技术方面 在Java语言中,处理空指针往往是一件很头疼的事情
    的头像 发表于 10-11 17:56 706次阅读

    FPGA和ASIC的概念、基本组成及其应用场景 FPGA与ASIC的比较

      FPGA和ASIC都是数字电路的实现方式,但它们有不同的优缺点和应用场景。本文将以通俗易懂的方式解释FPGA和ASIC的概念、基本组成、及其应用场景
    发表于 08-14 16:37 1750次阅读