允许空指针异常广告最好的方法
我正在寻找从一个复杂的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") : "");
如何
要字面上回答你的问题,你可以提取,在一个单独的方法和抓住潜在的例外。但是,这不是最好的做法:
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"));
我真的只会在这种情况下抓住NPE。容易吞下其他我们实际需要处理的异常。 –
@JoeC我认为代码也可能抛出ArrayIndexOutOfBoundsException。所以我把它保留了很多,并在代码中留下了一条评论,说如果可能,应该缩小异常类型。 – assylias
感谢您输入家伙,它的作品!
不要编写该代码。如果您的XML对象不能容忍空值,请不要将它们添加到集合中。 XML是一种分层数据表示,所以递归应该是你的朋友。 – duffymo
https://stackoverflow.com/questions/271526/avoiding-null-statements可能的重复。 – VGR