亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

空檢查鏈與捕獲NullPointerException

空檢查鏈與捕獲NullPointerException

鴻蒙傳說 2019-11-28 13:50:44
Web服務返回巨大的XML,我需要訪問它的深層嵌套字段。例如:return wsObject.getFoo().getBar().getBaz().getInt()問題是getFoo(),getBar(),getBaz()可能所有的回報null。但是,如果我null在所有情況下都進行檢查,則代碼將變得非常冗長且難以閱讀。此外,我可能會錯過某些領域的檢查。if (wsObject.getFoo() == null) return -1;if (wsObject.getFoo().getBar() == null) return -1;// maybe also do something with wsObject.getFoo().getBar()if (wsObject.getFoo().getBar().getBaz() == null) return -1;return wsObject.getFoo().getBar().getBaz().getInt();可以寫嗎try {    return wsObject.getFoo().getBar().getBaz().getInt();} catch (NullPointerException ignored) {    return -1;}或將其視為反模式?
查看完整描述

3 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

我建議考慮Objects.requireNonNull(T obj, String message)。您可以使用每個異常的詳細消息來構建鏈,例如


requireNonNull(requireNonNull(requireNonNull(

    wsObject, "wsObject is null")

        .getFoo(), "getFoo() is null")

            .getBar(), "getBar() is null");

我建議您不要使用特殊的返回值,例如-1。那不是Java風格。Java設計了異常機制來避免這種來自C語言的老式方式。


投擲NullPointerException也不是最好的選擇。您可以提供自己的異常(將其選中以保證將由用戶處理,或者不選中以進行更輕松的方式對其進行處理)或使用您正在使用的XML解析器中的特定異常。


查看完整回答
反對 回復 2019-11-28
?
富國滬深

TA貢獻1790條經驗 獲得超9個贊

假設情況確實如此,假設類結構確實不受我們的控制,我認為按照問題中的建議抓住NPE確實是一個合理的解決方案,除非性能是主要問題。一個小的改進可能是包裝throw / catch邏輯以避免混亂:


static <T> T get(Supplier<T> supplier, T defaultValue) {

    try {

        return supplier.get();

    } catch (NullPointerException e) {

        return defaultValue;

    }

}

現在,您可以簡單地執行以下操作:


return get(() -> wsObject.getFoo().getBar().getBaz().getInt(), -1);


查看完整回答
反對 回復 2019-11-28
  • 3 回答
  • 0 關注
  • 515 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號