首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免从最后块抛出异常

如何避免从最后块抛出异常
EN

Stack Overflow用户
提问于 2021-01-27 10:20:35
回答 2查看 128关注 0票数 2

我不希望toJson抛出异常,但是finally块可能会抛出异常。最好是将bas.close()封装在try/catch块中,还是应该使用try-with-resources重新编写它?

代码语言:javascript
复制
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;
}   
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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();}} 但是,在本例中,如果方法readLineclose都抛出异常,那么方法readFirstLineFromFileWithFinallyBlock将抛出从finally块抛出的异常;从try块抛出的异常将被抑制。相反,在示例readFirstLineFromFile中,如果同时从try块和throws语句抛出异常,那么readFirstLineFromFile方法将抛出从try块抛出的异常;从try块抛出的异常将被抑制。在Java 7和更高版本中,您可以检索被抑制的异常;有关更多信息,请参阅“抑制异常”一节。

使用try-语句,您可以编写如下方法:

代码语言:javascript
复制
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;
}   
票数 4
EN

Stack Overflow用户

发布于 2021-01-27 10:41:00

我很可能会有这样的想法:

代码语言:javascript
复制
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的负担。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65917108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档