如何在Java中优雅地处理空值
在这种情况下,我必须将值从一个对象复制到另一个对象。对于每个字段,copy语句都用以下剪下的样板代码包装:如何在Java中优雅地处理空值,java,nullpointerexception,Java,Nullpointerexception,在这种情况下,我必须将值从一个对象复制到另一个对象。对于每个字段,copy语句都用以下剪下的样板代码包装: if (a.getC() != null) { b.setC(a.getC()); } 我看了番石榴predition.checkNotNull(…),但它仍然抛出我试图回避的NPE 我如何才能以更自然的方式做到这一点?Apache commons-lang3提供了以下功能: b.setC(ObjectUtils.defaultIfNull(a.getC(), b.getC()))
if (a.getC() != null) {
b.setC(a.getC());
}
我看了番石榴predition.checkNotNull(…)
,但它仍然抛出我试图回避的NPE
我如何才能以更自然的方式做到这一点?Apache commons-lang3提供了以下功能:
b.setC(ObjectUtils.defaultIfNull(a.getC(), b.getC()));
但我必须承认,我不确定这是否真的是一种改进。您可以使用var args创建一个方法,检查所有args,以获得您的
if
语句:
public boolean argsNotNull(Object ... objs) {
boolean b = true;
for(Object o : objs) {
if(o == null) {
b = false;
break;
}
}
return b;
}
然后像这样使用它:
if(argsNotNull(a)) {
Object c = a.getC();
if(argsNotNull(b, c)) { // A null 'c' object may be valid here, depends on your logic
b.setC(c);
}
}
由于此方法使用var args,您可以根据需要为其提供任意多个args,但它无法在当前状态下使用原语。是b.C值,应该准确反映a.C中的内容吗?在这种情况下,如果a.C为空,那么b.C将为空,并且实际上不需要空检查 否则,为了避免使用大括号,可以执行以下操作:
b.setC((a.getC() == null) ? b.getC() : a.getC());
这假设b中的getter和setter完全匹配。如果a中的C为null,则setC()fromgetC()实际上什么也不做。它没有检查a或b是否为null。如果
b.setC
设置的值为null,是否有问题?如果不是,则不需要空检查。如果a
或b
为空,则此代码将抛出NPE的唯一方法。这并不能真正解决null
检查的问题。它只是把它委托给另一种方法。@Jeffrey OP要求更自然一些。这不如Groovy那么好,但它比(a!=null&&b!=null&&c!=null
)或大量非特定的try/catch块更好。这符合我的需要。谢谢。