如果关闭资源失败,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