Java NullPointerException 检查链式方法

tfb*_*bt8 5 java null nullpointerexception

我想在访问几个类深的字段(在 get 方法链中)时检查空指针。但是,如果早期的方法之一是null我无论如何都会得到NullPointerException

这就是我想要检查的内容,尽管它仍然可以获得NullPointerException

if(x.getLocation().getBuilding().getSolidFuelInd() != null)
            pol.setWood_heat_ind(x.getLocation().getBuilding().getSolidFuelInd() ? "Y" : "N");
Run Code Online (Sandbox Code Playgroud)

这是我希望上面的代码表现出的行为:

if(x.getLocation() != null)
    if(x.getLocation().getBuilding() != null)
        if(x.getLocation().getBuilding().getSolidFuelInd() != null)
            pol.setWood_heat_ind(x.getLocation().getBuilding().getSolidFuelInd() ? "Y" : "N");
Run Code Online (Sandbox Code Playgroud)

pol 上的字段是可选的,并且仅当上述 getter 不是时才应设置null。然而,建筑物和位置对象也可能是null,所以现在我必须检查它们是否有效。

有没有一种更短的方法可以像我想要的那样检查上述所有内容?

小智 6

使用 Java 8 的Optional<>类,您可以map这样设置值:

Optional.of(x)
    .map(ClassOfX::getLocation)
    .map(Location::getBuilding)
    .map(Building::getSolidFuelInd)
    .map(solidFuelInd -> solidFuelInd ? "Y" : "N")
    .ifPresent(pol::setWood_heat_ind);
Run Code Online (Sandbox Code Playgroud)

map仅当可选值不是时才会执行调用,null从而避免NullPointerException. 的目的是仅在有可用值时才ifPresent调用您的值。setWood_heat_ind

一个很好的单次调用相当于空检查。


Lui*_*ese 0

你可以捕获异常

    try{
        pol.setWood_heat_ind(x.getLocation().getBuilding().getSolidFuelInd() ? "Y" : "N");
    }catch(NullPointerException e){
        //e.printStackTrace(); or whatever you want
    }
Run Code Online (Sandbox Code Playgroud)

(参考您可能的解决方案)检查返回值意味着多次调用相同的方法,这就是我使用此解决方案的原因。

正如 Jay Harris 指出的那样,您显然可以检查值并保存返回参数,而不必再次调用相同的方法。您可以通过多种不同的方式来完成此操作,这里是一种

    Object loc=null,build=null;

    Boolean SFI = ((loc=x.getLocation())==null?null:
                   ((build=loc.getBuilding())==null?null:
                       (build.getSolidFuelInd())));

    if(SFI!=null)pol.setWood_heat_ind(SFI?"Y":"N");
Run Code Online (Sandbox Code Playgroud)

但是这值得吗?我故意让它变得比它可能的更复杂,但无论如何,如果你可以try...catch用两行简单的代码来实现,为什么要这样做呢?