我不希望toJson抛出异常,但是finally块可能会抛出异常。最好是将bas.close()封装在try/catch块中,还是应该使用try-with-resources重新编写它?
public String toJson() {
String json = null;
ByteArrayOutputStream bas = null;
try {
bas = new ByteArrayOutputStream();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(bas, this);
json = new String(bas.toByteArray());
} catch (Exception e) {
log.trace("Unable to parse JSON", e);
} finally {
if (bas != null) {
bas.close();
}
}
return json;
} 发布于 2021-01-27 10:25:27
您应该使用try-语句来完成该操作。下面是甲骨文关于试探性资源语句的教程的摘录,其中清楚地说明了使用它的好处:
在Java 7之前,您可以使用
finally块来确保资源被关闭,而不管try语句是正常完成还是突然完成。下面的示例使用一个finally块,而不是一个具有资源的语句: 静态字符串readFirstLineFromFileWithFinallyBlock(字符串路径)抛出IOException { BufferedReader br =新的BufferedReader(新FileReader( path) );尝试{返回br.readLine();}最后{ if (br != null) br.close();}} 但是,在本例中,如果方法readLine和close都抛出异常,那么方法readFirstLineFromFileWithFinallyBlock将抛出从finally块抛出的异常;从try块抛出的异常将被抑制。相反,在示例readFirstLineFromFile中,如果同时从try块和throws语句抛出异常,那么readFirstLineFromFile方法将抛出从try块抛出的异常;从try块抛出的异常将被抑制。在Java 7和更高版本中,您可以检索被抑制的异常;有关更多信息,请参阅“抑制异常”一节。
使用try-语句,您可以编写如下方法:
public String toJson() throws Exception {
String json = null;
try (ByteArrayOutputStream bas = new ByteArrayOutputStream()) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(bas, this);
json = new String(bas.toByteArray());
}
return json;
} 发布于 2021-01-27 10:41:00
我很可能会有这样的想法:
public String toJson() {
try (var bas = new ByteArrayOutputStream()) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(bas, this);
return new String(bas.toByteArray());
}
catch (Exception ie) {
throw new MyCustomJsonConverterException("Failed to render to JSON");
}
}也就是说,如果您期望将RuntimeException型序列化为异常(编程错误),则映射到JSON。毕竟,这是一个实例方法,类的所有不变量都应该在其他地方强制执行。这样,您就承担了从调用方检查null的负担。
https://stackoverflow.com/questions/65917108
复制相似问题