2017-10-04 59 views
0

我正在尋找從一個複雜的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

回答

0

要字面上回答你的問題,你可以提取,在一個單獨的方法和抓住潛在的例外。但是,這不是最好的做法:

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

4

您可以在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

這也同樣適用。 –

0

感謝您輸入傢伙,它的作品!