在没有NPE的情况下访问null Java对象的字段

时间:2016-05-11 20:29:33

标签: java android nullpointerexception null java-7

我正在开发一个Android项目,它在Java中使用了很多奇怪的空值检查,导致这样的代码行:

if (foo == null || foo.bar == null || foo.bar.foobar == null) {
    return;
}

我正在尝试使用Utility类

来清理它
public class Utility {
    public static boolean allNotNull(Object... objects) {
        for (Object object : objects) {
            if (objectIsNull(object)) { return false; }
        }
        return true;
    }

    public static boolean anyAreNull(Object... objects) {
        return !allNotNull(objects);
    }

    private static boolean objectIsNull(Object object) {
        try {
            return object == null;
        } catch (NullPointerException e) {
            return true;
        }
    }
}

使用这个类,我想将代码简化为

if (Utility.areAnyNull(foo.bar.foobar)) {
    return;
}

不幸的是,当A为null时,在进入areAnyNull函数之前崩溃。有没有办法防止函数崩溃,而不在我的每个if(Utility ...)调用周围包装try catch语句?或者,有没有更好的方法来清理我的if语句检查是否有空?

1 个答案:

答案 0 :(得分:0)

在Java中没有任何本地语法方法可以做到这一点。但是如果你有Java 8,你可以使用Optional做类似的事情:

boolean areAnyNull = !Optional.of(foo)
        .map(foo -> foo.bar)
        .map(bar -> bar.foobar)
        .isPresent();