给出以下代码:
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功能,可以通过避免空初始化来更加优雅地表达这一点。但我不知道该搜索什么。
答案 0 :(得分:2)
您的代码的作用是:
最简洁的方法 - 这不是新的 - 是:
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,则不必处理其问题:
Optional<Response>
- 现在方法签名是诚实的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)