编程语言
首页 > 编程语言> > 如果关闭资源失败,java怎么办?

如果关闭资源失败,java怎么办?

作者:互联网

在过去,我不得不使用一些资源,我在try块中声明了它,在try块中创建了它,然后在finally块中关闭了它.如果关闭失败,则将其放入内部try块中.

Resource r=null;
try{
   r=new Resource();
   use(r); 
} 
catch(){
    outputAndLog(something);
}
finally{
    if(r != null){
        try{
        }
        catch(){
            outputAndLog(somethingElse);
        }
    }
}

现在我们可以使用

try(Resource r = new Resource()){

Java语法.障碍终于对我们不可见了.但是里面有什么?我的意思是,如果关闭失败怎么办?

解决方法:

资源:Link

首先,try-with-resources实际上不处理任何异常(就像通过记录在代码中完成的一样).基本上,它将从try-catch-finally结构抛出的可能的多个Exception编组为可处理的对象-包含抑制的Exception的Exception.

如果try块引发Exception,则资源将被关闭,并且将禁止产生的Exception.结果,抛出的Exception对象将引用被抑制的Exception.
如果try块未引发Exception,则资源将被关闭,并且将抛出异常.

因此,我们可以得出结论,您的示例不等效:
当使用try-catch-finally时,成功处理后关闭导致的异常将被视为“恰好关闭错误”,而使用try-with-resources语句时,此类异常将与实际发生的异常一样处理.处理.

tl; dr
如果处理资源的关闭包含更多内容,那么try-with-resources语句可能会产生在老式的try-catch-finally中最终不会遇到的错误.这种东西的一个例子是jdbc连接的提交和回滚.

因此,最终产生一些代码

try(Resource resource = new Resource()){
    // other code
}

确切的等效条件是:

{
    Resource resource = null;
    Exception exc = null;
    try {
        resource = new Resource();
        // other code
    } catch (Exception e) {
        exc = e;
        throw e;
    } finally {
        if (resource != null) {
            if (exc != null) {
                try {
                    resource.close();
                } catch (Throwable t) {
                    exc.addSuppressed(t);
                }
            } else {
                resource.close();
            }
        }
    }
}

标签:try-catch,finally,java,resources
来源: https://codeday.me/bug/20191025/1929330.html