gpt4 book ai didi

java - Java 8 更好的 null 管理 try-catch

转载 作者:行者123 更新时间:2023-11-30 06:40:57 25 4
gpt4 key购买 nike

给出以下代码:

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 的一个新功能可以通过避免 null 初始化以更优雅的方式表达这一点。但我不知道要搜索什么。

最佳答案

您的代码的作用是:

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

执行此操作的最简洁方法(这并不新鲜)是:

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

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

只有一个 return 的替代方案更长、更困惑,并且涉及在比必要范围更广的范围内声明可变变量:

Foo response = null;
try {
response = someMethod(...);
} catch (SomeException e) {
logOrWhatever(e);
}
return response;
  • 它更加困惑。想一想您需要阅读多少内容才能回答“如果 someMethod() 抛出异常,此方法会返回什么?”这个问题。在第一个示例中,它就在 catch 中。堵塞。在第二步中,您必须跟踪代码将所有可能的状态更改为 response .
  • response无法声明final -- 我认为你不应该使用 final到处都是,但我确实认为拥有尽可能多的变量可以声明为final是件好事。
  • response的范围位于 try 之外堵塞。更整洁的方法将数据保留在更窄的范围内,这总是好的。

通过输入 returnfinally block ,您的代码会执行其他操作 - 如果抛出任何其他类型的异常null将在没有任何日志记录或其他异常处理的情况下返回。这不太可能是一个好主意——它只会使错误难以诊断:Try-catch-finally-return clarification

<小时/>

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

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

这样,您的更多代码就可以变得更加简单和清晰,因为它不必充满 if(x==null)守卫。

关于java - Java 8 更好的 null 管理 try-catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44389998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com