Java 如何检查对象和嵌套字段是否为空

Java 如何检查对象和嵌套字段是否为空,java,variables,object,field,Java,Variables,Object,Field,我有一个对象,我想检查这个对象或嵌套字段是否为空。我想打印这个neted字段,但我应该检查某个级别是否有null,否则我将得到null指针异常 我知道我能做到: if( object != null && object.A != null && object.A.B != null && object.A.B.C != null && object.A.B.C.D != null) { doSomething( object.A.B

我有一个对象,我想检查这个对象或嵌套字段是否为空。我想打印这个neted字段,但我应该检查某个级别是否有null,否则我将得到null指针异常

我知道我能做到:

if( object != null && object.A != null && object.A.B != null && object.A.B.C != null && object.A.B.C.D != null) { doSomething( object.A.B.C.D);}

但是它太长了。您知道更好的检查方法吗?

您可以使用返回所有子对象的方法在所有对象上实现一个接口,并创建一个递归调用自身的方法,以验证所有对象是否已设置。

假设这是一个防止方法误用的检查,因此这种情况不会发生太多时间

只要捕获此异常,就会使值无效

private boolean isValid(YourObject object){
    try{
         return object.A.B.C.D != null;
    } catch (NullPointerException npe){
        return false;
    }
}
当然,如果您正在进行大量验证,并且经常返回false,则不要使用此解决方案,异常是一个繁重的过程

编辑:


正如费尔多所指出的,即使没有例外,使用try-catch也是有成本的。但是使用这个,我可以假设这将是有限的,并且在这个独特的行上没有太多的优化要做。

可选是Java8中的一个好方法

String value = foo.getBar().getBaz().toString();
在可选的情况下,它将是:

String value = Optional.ofNullable(foo)
                       .map(Foo::getBar)
                       .map(Bar::getBaz)
                       .map(Baz::toString)
                       .orElse("EmptyString");

您可以尝试将嵌套字段插入到数组中,然后为数组中的每个对象运行null检查,但我认为这太复杂了以至于无法实际考虑。但这是有可能的。防止它们为空。使用NullObject模式/范例。或者Axel所说的Vvwell,如果这是一个复杂的嵌套数据,那么在最后做一个检查并捕获NPE怎么样,如果发生异常,它是无效的。使用异常不是一个好主意,但在某些“异常”中,我想这是您可以切换到并执行
的最简单方法,如果(object?.a?.B?.C?.D){doSomething(object.a.B.C.D);}
毕竟,必须执行4个间接操作是一种代码味道……但异常发生时不仅代价高昂。try/catch的存在已经触发了成本。嗯,这可能会改变很多@Fildor。有那么贵吗?看到编辑和链接,如果这个想法是真的需要,这应该是可以接受的。没有那么多。我只是想指出这一点。因此,如果经常进行验证,找到一个不需要验证的解决方案可能会更有效。但我同意,当这成为一个问题时,必须考虑到这一点。@Fildor谢谢你指出这一点。很高兴知道。我同意这不是最好的解决办法,但必须这样说;)有人知道这与if/else的速度相比如何吗?