为了账号安全,请及时绑定邮箱和手机立即绑定

空检查链与捕获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 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信