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
一个很好的单次调用相当于空检查。
你可以捕获异常
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用两行简单的代码来实现,为什么要这样做呢?
| 归档时间: |
|
| 查看次数: |
1703 次 |
| 最近记录: |