在我们的java开发过程中,NullPointerException一直是一个头疼的问题,因为你永远不知道null出现在哪。如下段代码。
Integer number=user.getUserDetail().getUserIntegral().getIntegral().getIntegralDetail().getNumber();
我们用上述方法想拿到number,可能会出现NullPointerException异常,通
常我们会使用下边的代码判断拿值:
Integer number;
if (user!=null){
if (user.getUserDetail()!=null){
if (user.getUserDetail().getUserIntegral()!=null){
if (user.getUserDetail().getUserIntegral().getIntegral()!=null){
if(user.getUserDetail().getUserIntegral().getIntegral().getIntegralDetail()!=null){
number=user.getUserDetail().getUserIntegral().getIntegral().getIntegralDetail().getNumber();
}
}
}
}
}
虽然问题得到解决,但if太多,不太美观,可以使用Optional来优化代码(Optional介绍我就不多说了):
Integer number = Optional.ofNullable(user)
.map(User::getUserDetail)
.map(UserDetail::getUserIntegral)
.map(UserIntegral::getIntegral)
.map(Integral::getIntegralDetail).map(d -> d.number)
.orElse(0);
代码意思是我去拿number,如果不出现NullPointerException就拿到number,不管哪一步出现null,就直接跳到orElse给默认值,当然也可以自定义抛出异常。
Integer number = Optional.ofNullable(user)
.map(User::getUserDetail)
.map(UserDetail::getUserIntegral)
.map(UserIntegral::getIntegral)
.map(Integral::getIntegralDetail).map(d -> d.number)
.orElseThrow(()->{throw new RuntimeException("number 为null");});
执行结果:
甚至可以在.orElse()执行方法。
本文只是众多去if的办法中使用jdk1.8的Optional新特性来完成的,当然还有其他方法,jdk14也出了关于NullPointerException的处理,大家可以去感受感受!!!
附带测试代码:
package com.nlx.fileoperations.actuator.test;
import lombok.Data;
import java.util.Optional;
/**
* @author Tony.niu (hystrix0779@yeah.net)
* @version V1.0
* @date 2020/7/25
**/
public class OptionalTest {
@Data
static class User{
private UserDetail userDetail;
}
@Data
static class UserDetail{
private UserIntegral userIntegral;
}
@Data
static class UserIntegral{
private Integral integral;
}
@Data
static class Integral{
private IntegralDetail integralDetail;
}
@Data
static class IntegralDetail{
private Integer number;
}
public static void main(String[] args) throws Exception {
User user = getUser();
Integer number = Optional.ofNullable(user)
.map(User::getUserDetail)
.map(UserDetail::getUserIntegral)
.map(UserIntegral::getIntegral)
.map(Integral::getIntegralDetail).map(d -> d.number)
.orElse(0);
System.out.println(number);
if (user!=null){
if (user.getUserDetail()!=null){
if (user.getUserDetail().getUserIntegral()!=null){
if (user.getUserDetail().getUserIntegral().getIntegral()!=null){
if(user.getUserDetail().getUserIntegral().getIntegral().getIntegralDetail()!=null){
number=user.getUserDetail().getUserIntegral().getIntegral().getIntegralDetail().getNumber();
}
}
}
}
}
System.out.println(number);
}
public static User getUser(){
User user=new User();
UserDetail userDetail=new UserDetail();
UserIntegral userIntegral=new UserIntegral();
Integral integral=new Integral();
IntegralDetail integralDetail=new IntegralDetail();
userIntegral.setIntegral(integral);
userDetail.setUserIntegral(userIntegral);
user.setUserDetail(userDetail);
return null;
}
}