如何在Java中优雅地处理空值

时间:2014-04-02 13:00:44

标签: java nullpointerexception

我有一种情况,我必须将值从一个对象复制到另一个对象。对于每个字段,复制语句都包含以下剪切的样板代码:

if (a.getC() != null) {
   b.setC(a.getC());
}

我看了一眼番石榴Precondition.checkNotNull(...),但它仍然会抛出我试图逃​​避的NPE。

我怎样才能以更自然的方式做到这一点?

3 个答案:

答案 0 :(得分:1)

Apache commons-lang3提供了这个:

b.setC(ObjectUtils.defaultIfNull(a.getC(), b.getC()));

但我必须承认,我不确定这是否真的会有所改善。

答案 1 :(得分:1)

您可以使用var 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,但它不适用于当前状态的基元。

答案 2 :(得分:0)

b.C 值是否应该准确反映 a.C 中的内容?在这种情况下,如果 a.C 为null,则 b.C 应为null,并且您不需要进行空检查。

否则,要避免使用curley braces,你可以这样做:

b.setC((a.getC() == null) ? b.getC() : a.getC());

这假设b中的getter和setter完全匹配。如果a中的C为null,那么来自 getC() setC()实际上什么都不做。