当前位置:首页 > 数码 > 空指针审核-Java-不堪忍耐之痛 (空指针异常常用解决办法)

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

admin8个月前 (04-16)数码38

前言

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-不堪忍耐之痛 (空指针异常常用解决办法)” 的相关文章

选择性-过多的关键词会增加SEO工作的复杂性-关键词不应过多 (选择性太多)

选择性-过多的关键词会增加SEO工作的复杂性-关键词不应过多 (选择性太多)

引言 在不断演进的软件开发领域,保持最新技术至关重要。从 Java 11 迁移到 Java 21 是一个明智的决定,它带来了显着的优势和创新,可以提升应用程序的安全性、性能和开发效率。...

Java循环结构与实现方式 (java循环语句案例)

Java循环结构与实现方式 (java循环语句案例)

循环简介 循环是编程中常用的一种控制结构,用于重复执行某一段代码或操作。循环的执行需要满足一定的条件,当条件满足时,循环会一直执行,直到条件不满足时才结束。所以循环其实就是重复地完成某一件事...

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

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

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

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

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

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

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

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

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

Java中不倡导经常使用foreach的六大场景 (java中不等于怎么写)

Java中不倡导经常使用foreach的六大场景 (java中不等于怎么写)

在中,foreach是一个罕用的循环结构,它可以极大地简化遍历数组或汇合(例如List或Set)的代码。它通常被以为是一种愈加繁复和易读的迭代形式。但是,或许有一些状况下不倡导经常使用foreac...

Java-渣滓回收器的运作形式-对不再沉闷对象的跟踪机制

Java-渣滓回收器的运作形式-对不再沉闷对象的跟踪机制

作为一门面向对象的编程言语,具备智能内存治理的个性。这象征着开发人员无需手动调配和监禁内存,而是由Java虚构机的渣滓回收器担任治理。渣滓回收器经过监督程序中不再经常使用的对象来回收内存,以提高内...

掌握Java并发编程-免除竞态条件的困扰 (掌握JavaScript基础)

掌握Java并发编程-免除竞态条件的困扰 (掌握JavaScript基础)

1. 竞态条件的概念和问题 竞态条件指的是多个线程同时访问共享资源,由于执行顺序的不确定性,导致程序结果与预期不符的情况。竞态条件问题通常出现在以下情况下: 多个线程争用同一把锁 多个线程...