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

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

admin3个月前 (04-16)数码21

前言

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

深入探讨-Java-编程中的类继承与接口实现 (深入探讨交流)

深入探讨-Java-编程中的类继承与接口实现 (深入探讨交流)

简介 类索引、父类索引和接口索引是在 Class 文件中用于确定类的继承关系的重要数据。通过这些索引,Java 虚拟机 (JVM) 可以准确地建立类之间的继承关系,实现多态性和接口的实现。...

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

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

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

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

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

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

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

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

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

用Java实现自动化测试和质量控制-分步指南 (用java实现幸运抽奖)

用Java实现自动化测试和质量控制-分步指南 (用java实现幸运抽奖)

自动化测试概述 自动化测试是指使用软件工具和脚本来执行测试任务,以代替人工操作并提高测试效率。 自动化测试的优势 提高效率 可重复性 提高覆盖率...

Java-以及如何成功它-为何它本应更繁难-异步编程 (java一个子类可以有多个父类吗)

Java-以及如何成功它-为何它本应更繁难-异步编程 (java一个子类可以有多个父类吗)

在过去的好多年里,多线程和异步不时作为技术里的初级局部,在技术序列中,一个言语分为入门局部、进阶局部和初级局部,所以,异步是作为其中的初级技术局部存在的。 关于异步和多线程这局部吧,经常存在...

消除反复编译困扰-优化效率-释放Java开发潜能 (消除反复编译命令)

消除反复编译困扰-优化效率-释放Java开发潜能 (消除反复编译命令)

在开发过程中,反复编译是一个常见的问题,特别是在大型项目或者需要频繁修改代码的情况下。每次修改代码后都需要重新编译整个项目,这样耗费了大量的时间和资源,降低了开发效率。为了解决这个问题,我们可以采...

Java-三分钟速成-揭秘多线程编程新范式-虚拟线程 (java三目表达式)

Java-三分钟速成-揭秘多线程编程新范式-虚拟线程 (java三目表达式)

背景 虚拟线程是 Java 语言中的一种轻量级线程,可以减少编写、维护和调试高吞吐量并发应用程序的工作量。虚拟线程的详细背景介绍可以在 JEP 444 中找到。 平台线程...