当前位置:首页 > 数码 > 正文内容

空指针审核-Java-不堪忍耐之痛 (空指针异常常用解决办法)

admin2年前 (2024-04-16)数码221

前言

NPE疑问

NPE疑问就是咱们在开发中经常碰到的NullPointerException.假定咱们有两个类,他们的UML类图如下图所示:

如今须要访问用户地址消息的省份,繁难代码为:user.getAddress().getProvince();

在这种写法中,当user为null时,是有或许报NPE意外的。为了处置这个疑问,于是驳回上方的写法:

publicStringOptGetProvince(Useruser){if(user!=null){Addressaddress=user.getAddress();if(address!=null){Stringprovince=address.getProvince();returnprovince;}return"none";}}

这种写法是比拟繁琐的,为了防止上述奇丑的写法。于是JAVA8提供了Optional类来优化这种写法:

publicStringOptGetProvince(Useruser){returnOptional.ofNullable(user).map(s->s.getAddress()).map(a->a.getProvince()).orElse("none");}

可以看到,经过Optional的经常使用,可以很好的处置if以及嵌套判空的疑问,使得全体的判别变得清爽繁复多了。

Optional经常使用

咱们可以把Optional类看成是一个容器,咱们将对象存储到容器中后,经过调用内置的API,可以较为安保地过滤掉或许存在的空指针疑问,防止繁琐嵌套的if、else操作,让咱们的代码尽或许的繁复。API关键分5个大类。

结构函数:empty,of,ofNullable

empty前往一个空的Optional对象。

Optional.empty();

of依据传入的值生成Optional对象。

//形式2将非空对象作为属性传入Optional类中Useru=newUser("小明",16);Optional.of(u.getAddress());

ofNullable和of方法一样,依据传入的值生成optional对象。

//形式3将非空对象作为属性传入Optional类中Useru=newUser("小明",16);Optional.ofNullable(u.getAddress());

of和ofNullable的作用很相近,从Optional类的源代码看的话,可以发现关于ofNullable方法的话是有启动判空的。也就是说,假设经常使用of方法传入的参数是null,雷同会报空指针。

值选用方法:orElse,orElseGet和orElseThrow

这三个方法相当于SQL中的IFNULL函数,若Optional中值为null,则前往给定的自动值。

不堪忍耐之痛
Users=newUser("小明",16,newAddress());Stringresult=Optional.ofNullable(s.getAddress().getProvince()).orElse("深圳");
Users=newUser("小明",16,newAddress());Stringresult=Optional.ofNullable(s.getAddress().getProvince()).orElseGet(()->"深圳");

orElseThrow

Users=newUser("小明",16,newAddress());Strings3=Optional.ofNullable(s.getAddress().getProvince()).orElseThrow(()->newIllegalArgumentException("缺少参数"));

关于orElseThrow和orElseGet两个方法,是驳回函数式接口的形式来作为参数的。同时,关于orElse和orElseGet两个方法,作用相近,区别是若Optional对象中的值不为空,则orElseGet不会创立参数中的对象,而orElse无论什么状况都会创立参数对象。

判空函数:isPresent和ifPresent

两个函数的用法相似,都可以用作判空,区别在于当不为空时,ifPresent会口头对应的函数。

Useruser=newUser("小明",16,newAddress());booleanb1=Optional.ofNullable(user.getAddress()).isPresent();System.out.println(b1);//true
Useruser=newUser("小明",16,newAddress());Optional.ofNullable(user.getAddress()).ifPresent(address->System.out.println(address));

值转换函数:map和flagMap

值转换的就是对Optional对象中的value值启动转换,对值运行(调用)作为参数的函数,而后将前往的值包装在Optional中

Useruser=newUser("小明",16,newAddress());Strings1=Optional.ofNullable(user).map(s->s.getName()).get();
Useruser=newUser("小明",16,newAddress());Strings1=Optional.ofNullable(user).flatMap(s->s.getName()).get();

两个函数都可以成功值的转换,两者的区别是二者的入参不同。以上方的flagMap的示例代码为例,咱们须要在User类中重写一下getName方法,使其前往Optional对象。

过滤(挑选)函数:filter

该函数的作用是,判别Optional中的值能否满足指定条件,若满足则前往,否则前往一个EMPTY对象。

Useruser=newUser("小明",16,newAddress());Userresult=Optional.ofNullable(user).filter(s->s.getName().equals("小红")).orElseGet(()->newUser("小蓝",10));System.out.println(result);//user{address=null,,age=10}

这里会挑选出满足姓名为小红的User对象,若不满足则新建一个姓名为小蓝的User对象。

最后

须要留意,经常使用Optonal这种链式编程虽然繁复化了程序代码,然而逻辑性不是很清楚,相对来说会损失必定的代码可读性,详细的经常使用须要开发人员在实践场景中启动掂量。团体倡导哪怕是自己不经常经常使用也要尽量把握,防止产生浏览源码的时刻显得难堪。


java空指针异常问题

1.所谓的指针,就是java中的对象的引用。 比如String s;这个s就是指针。 2.所谓的空指针,就是指针的内容为空,比如上面的s,如果令它指向null,就是空指针。 3.所谓的空指针异常,就是一个指针是空指针,你还要去操作它,既然它指向的是空对象,它就不能使用这个对象的方法。 比如上面的s假如为null,你还要用s的方法,比如( String x);那么就会产生空指针异常。

java的空指针问题。。。。

问题找到了,注意student=new Student[totalNumber]这句。 对象数组在初始化时并没有对其中的对象进行初始化,因此在初始化数组之后还要初始化其中的对象,可以在student=new Student[totalNumber]之后加上for(int i=0;i<totalNumber;i++)student[i]= new Student(,,);或者在private class saveListener implementsActionListener中使用student[k]前初始化:student[k]=new Student(xuehao,xinmin,chenji);还有private class displayListener implements ActionListener中的output+=student[i]()+student[i]()+student[i]()+\n;这一句最好改为:if(student[i]!=null){ output+=student[i]()+student[i]()+student[i]()+\n;}这样就不容易出现NullPointerException了

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Java

“空指针审核-Java-不堪忍耐之痛 (空指针异常常用解决办法)” 的相关文章

大编程趋势-5-年-Java-2024-开发者的 (编程是大趋势吗)

大编程趋势-5-年-Java-2024-开发者的 (编程是大趋势吗)

Java作为编程领域的支柱,拥有超过900万开发人员和超过30年的发展历史,它以其先进的安全功能、优越的性能和跨平台开发能力而闻名,展望2024年,Java正准备进行一场突破性的转变,以塑造开发人员进…

Java-Lambda-表白式的多面运行-从基础到初级 (java类的定义和使用)

Java-Lambda-表白式的多面运行-从基础到初级 (java类的定义和使用)

Lambda表白式是8中引入的最有影响力的性能之一,它们经过准许繁复而优雅地创立匿名函数来成功Java中的函数式编程,在这篇博文中,咱们将讨论编写lambda表白式的各种方式,概述lambda表白式是…

助推高性能运行程序开发-革命性的并发编程处置打算-的虚构线程-Java-21 (高性能运作有什么用)

助推高性能运行程序开发-革命性的并发编程处置打算-的虚构线程-Java-21 (高性能运作有什么用)

21最关键的个性之一就是虚构线程,JEP444,这些轻量级的线程降落了编写、保养和观察高吞吐量并行运行所需的致力,在探讨新个性之前,让咱们先看一下以后的形态,以便更好地理解它试图处置什么疑问以及带来了…

在-Java-年依然盛行的-2023-25-个要素 (在javascript中)

在-Java-年依然盛行的-2023-25-个要素 (在javascript中)

译者,刘汪洋审校,重楼学习的环节中,我看法到在90年代末OOP正值鼎盛期间,Java作为能够真正成功这些概念的言语显得尤为突出,虽然我此前学过C,,但相比Java影响较小,我特意参观Java的平台独立…

彻底了解两者的弱小组合-Java与RPA (彻底了解两者的关系)

彻底了解两者的弱小组合-Java与RPA (彻底了解两者的关系)

前段期间降级系统的时刻,发现多了一个名为PowerAutomate的运行,关上了解后发现是一个智能化运行,依据其形容,可以智能口头一切日常义务,说的还是比拟夸张,繁难用了下,关于、阅读器都是支持的,同…

Java连接池配置不当引起的连接泄漏和数据库连接数超限问题排查 (java连接sqlserver数据库代码)

Java连接池配置不当引起的连接泄漏和数据库连接数超限问题排查 (java连接sqlserver数据库代码)

连接池配置的重要性连接池是一种用于管理数据库连接的技术,它可以提高系统性能和稳定性,合理配置连接池可以带来以下好处,提高性能节省资源避免连接泄漏控制连接数量常见连接池配置问题如果连接池配置不合理,可能…

a-a-Java-启动图像识别和图像处置-经常使用-href=-全面指南 (aajaas智能锁说明书)

a-a-Java-启动图像识别和图像处置-经常使用-href=-全面指南 (aajaas智能锁说明书)

图像识别和图像处置是计算机视觉畛域的关键运行之一,在中成功图像识别和处置可以经常使用各种库和框架来成功,上方将引见一些罕用的方法和工具,1、Java图像处置库的选用Java提供了丰盛的图像处置库,其中…

轻量级-Java-表白式引擎-aviator-不容错过的优秀选用 (轻量级javaee企业应用实战pdf下载)

轻量级-Java-表白式引擎-aviator-不容错过的优秀选用 (轻量级javaee企业应用实战pdf下载)

aviator原本是一个轻量级、高性能的基于JVM的表白式引擎,不过从5.0.0版本开局,aviator更新成为了aviatorScript,成为一个高性能、轻量级寄宿于JVM,包含平台,之上的脚本言…