空指针审核-Java-不堪忍耐之痛 (空指针异常常用解决办法)
前言
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了
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。