空检查链与捕获NullPointerException

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;

}

或将其视为反模式?


鸿蒙传说
浏览 489回答 3
3回答

缥缈止盈

我建议考虑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解析器中的特定异常。

富国沪深

假设情况确实如此,假设类结构确实不受我们的控制,我认为按照问题中的建议抓住NPE确实是一个合理的解决方案,除非性能是主要问题。一个小的改进可能是包装throw / catch逻辑以避免混乱:static <T> T get(Supplier<T> supplier, T defaultValue) {&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; return supplier.get();&nbsp; &nbsp; } catch (NullPointerException e) {&nbsp; &nbsp; &nbsp; &nbsp; return defaultValue;&nbsp; &nbsp; }}现在,您可以简单地执行以下操作:return get(() -> wsObject.getFoo().getBar().getBaz().getInt(), -1);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java