【问题标题】:Best way to allow null pointer exception ad get over it允许空指针异常广告克服它的最佳方法
【发布时间】:2018-03-15 19:29:35
【问题描述】:

我希望使用来自复杂 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") : "");

怎么可能

【问题讨论】:

标签: java error-handling nullpointerexception


【解决方案1】:

要从字面上回答您的问题,您可以在单独的方法中提取它并捕获潜在的异常。但这不是最佳做法:

private static Object getValueOrNull(Supplier<Object> s) {
  try {
    return s.get();
  } catch (Exception e) { //narrow down the exception if possible
    return null;
  }
}

你可以这样调用(值可能为空):

Object value = getValueOrNull(() -> obj.getObject("YYY").getArray("gob").getObject(0).getString("gobValue"));

【讨论】:

  • 在这种情况下,我真的只会抓住 NPE。轻松吞下我们实际需要处理的其他异常。
  • @JoeC 我认为代码也可能抛出 ArrayIndexOutOfBoundsException。所以我把它放宽了,并在代码中添加了一个注释,说如果可能的话应该缩小异常类型。
【解决方案2】:

您可以将其包装在 Optional 中并隐式处理空值:

Optional.of(obj).map(o -> o.getObject("YYY")).map(o -> o.getArray("gob")) /* [snip] */
        .orElse(""); //etc

【讨论】:

  • Optional.ofNullable(obj.getObject("YYY"))...
猜你喜欢
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多