允许空指针异常广告最好的方法

问题描述:

我正在寻找从一个复杂的xml对象中填充一些对象的对象。为了达到正确的价值,我必须通过一大串元素,我必须检查它们全部不为空。所以我的代码看起来像这个X 9次。我不想因为缺少一个元素而停止填充过程,我想以某种方式“跳过”空指针并进入下一个规则。我唯一的想法是把每一行放在try/catch块中。有更好的想法?由于允许空指针异常广告最好的方法

objModel.setProviderHeadquarterName(obj.getObject("YYY") != null && obj.getObject("YYY").getArray("gob") != null && obj.getObject("YYY").getArray("gob").size() > 0 && obj.getObject("YYY").getArray("gob") != null ? obj.getObject("YYY").getArray("gob").getObject(0).getString("gobValue") : ""); 
objModel.setProviderHeadquarterName(obj.getObject("XXX") != null && obj.getObject("XXX").getArray("tem") != null && obj.getObject("XXX").getArray("tem").size() > 0 && obj.getObject("XXX").getArray("tem") != null ? obj.getObject("XXX").getArray("tem").getObject(0).getString("temValue") : ""); 
objModel.setProviderHeadquarterName(obj.getObject("ZZZ") != null && obj.getObject("ZZZ").getArray("has") != null && obj.getObject("ZZZ").getArray("has").size() > 0 && obj.getObject("ZZZ").getArray("has") != null ? obj.getObject("ZZZ").getArray("has").getObject(0).getString("hasValue") : ""); 

如何

+3

不要编写该代码。如果您的XML对象不能容忍空值,请不要将它们添加到集合中。 XML是一种分层数据表示,所以递归应该是你的朋友。 – duffymo

+0

https://stackoverflow.com/questions/271526/avoiding-null-statements可能的重复。 – VGR

要字面上回答你的问题,你可以提取,在一个单独的方法和抓住潜在的例外。但是,这不是最好的做法:

private static Object getValueOrNull(Supplier<Object> s) { 
    try { 
    return s.get(); 
    } catch (Exception e) { //narrow down the exception if possible 
    return null; 
    } 
} 

,你可以这样调用(该值可能为null):

Object value = getValueOrNull(() -> obj.getObject("YYY").getArray("gob").getObject(0).getString("gobValue")); 
+0

我真的只会在这种情况下抓住NPE。容易吞下其他我们实际需要处理的异常。 –

+0

@JoeC我认为代码也可能抛出ArrayIndexOutOfBoundsException。所以我把它保留了很多,并在代码中留下了一条评论,说如果可能,应该缩小异常类型。 – assylias

您可以在Optional把这个包和处理隐含的空值:

Optional.of(obj).map(o -> o.getObject("YYY")).map(o -> o.getArray("gob")) /* [snip] */ 
     .orElse(""); //etc 
+2

或者'Optional.ofNullable(obj.getObject(“YYY”))...' – Bohemian

+0

这也同样适用。 –

感谢您输入家伙,它的作品!