使用Java 8更好地进行空管理try-catch

时间:2017-06-06 12:27:34

标签: java

给出以下代码:

StaticPOIDataType response = null;
try {
  final JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
  final Unmarshaller unmarshaller = jc.createUnmarshaller();
  unmarshaller.setSchema(getSchema());

  response =((JAXBElement<StaticPOIDataType>) unmarshaller.unmarshal(cpoGatewayURL)).getValue();

} catch (JAXBException e) {
  e.printStackTrace();
} finally {
  return response;
}

我听说过一种新的Java 8功能,可以通过避免空初始化来更加优雅地表达这一点。但我不知道该搜索什么。

3 个答案:

答案 0 :(得分:2)

您的代码的作用是:

  • 调用一些方法
  • 如果它抛出异常,记录(或其他)错误并返回null
  • 否则返回它返回的内容

最简洁的方法 - 这不是新的 - 是:

try {
    return someMethod(...);
} catch (SomeException e) {
    logOrWhatever(e);
    return null;
}

有些人反对多个return - 但是在这样的短块中,这是最清晰的方式(如果您的块不是这么短,请执行 extract-method 重构,直到它为止。

只有一个return的替代方案更长更麻烦,并涉及在更广泛的范围内声明一个可变变量:

Foo response = null;
try {
   response = someMethod(...);
} catch (SomeException e) {
   logOrWhatever(e);
}
return response;
  • 它更杂乱。考虑一下您需要做多少阅读才能回答“如果someMethod()抛出异常,该方法会返回什么?”。在第一个例子中,它位于catch块中。在第二步中,您必须遵循代码,将所有可能的状态更改都response
  • response无法声明为final - 我认为您不应该在任何地方使用final,但我认为这样做很好尽可能多的变量可以宣布为最终变量。
  • response的范围超出了try区块。更整洁的方法将数据保持在更窄的范围内,这总是好的。

return置于finally块中,您的代码会执行其他操作 - 如果抛出任何其他类型的异常null将会没有任何记录或其他异常处理返回。这不太可能是一个好主意 - 它只会让错误诊断错误:Try-catch-finally-return clarification

但是,更一般地说,返回null是您应该尽量避免的。你的问题标题提到了“空管理”,但是你在程序中引入了空。如果您没有选择返回null,则不必处理其问题:

  • 如果null表示“出错了”,请不要这样做。处理更高的异常(如果您愿意,将其作为不同的异常类型重新抛出)
  • 如果方法的语义是“这可能会返回响应,或者可能没有响应”,请考虑:
    • 使方法返回Optional<Response> - 现在方法签名是诚实的
    • 使用“Null对象”模式。也就是说,而不是返回null返回new EmptyResponse()

这样,您的代码可以更简单,更清晰,因为它不必充满if(x==null)警卫。

答案 1 :(得分:1)

您正在寻找的是可选的。这是下面的代码享受

try {
        final JAXBContext jc = JAXBContext.newInstance(ObjectFactory.class);
        final Unmarshaller unmarshaller = jc.createUnmarshaller();
        unmarshaller.setSchema(getSchema());

        return Optional.ofNullable((JAXBElement<StaticPOIDataType>) unmarshaller.unmarshal(cpoGatewayURL)).getValue());

    } catch (JAXBException e) {
        e.printStackTrace();
    }

    return Optional.empty();

答案 2 :(得分:-2)

我认为您正在寻找Java 8中的Optional,

请找到包含不错样品的本文档。

https://dzone.com/articles/java-8-optional-avoid-null-and