202111-27更文-Java使用try-with-resource代替finally关闭资源

149 阅读2分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

Java使用try-with-resource代替finally关闭资源

前文

本文主要为来源于书本中一些知识的总结与开发时对该内容的理解,并非代表完全正确。如有错误之处还请见谅。

写法区别

首先需要对两者的写法做一下基本的了解。当涉及到try中需要进行资源关闭时,有如下两种写法:

  • 使用try-finally
//获取资源
try{
    //执行具体的逻辑
}finally{
    //关闭资源
}
  • 使用try-with-resource
try(//直接在此处获取资源,逻辑执行结束后自动关闭对于资源的连接){
    //执行逻辑,无需额外代码进行资源关闭
}

代替原因

我们之所以要使用try-with-resource或者finally的原因,主要是由于资源使用结束后需要及时关闭,否则可能会产生系统的性能问题。至于为什么更推荐使用try-with-resource,下面来看一个多层资源的示例:

//获取资源1
try{
    //获取资源2
    try{
        //逻辑执行
    }finally{
        //关闭资源2
    }
}finally{
    //关闭资源1
}

如上所示,当我们需要对于多个资源进行操作时,可能就有如上所示的结构。当资源2处理过程中出现异常时,例如某些特殊异常,硬件异常等等,可能在关闭资源时同样会出现异常。这样当执行关闭资源2的finally的代码时,会出现try中异常的记录被完全替代,在异常堆栈中我们只能看到finally中的关闭异常,这并非是我们所期待的。

同样的,如果如上的逻辑采用try-with-resource,则执行过程中的异常与关闭异常都会被记录。只不过由于要优先显示执行过程中的异常,第二个关闭异常首先会被忽略,但在堆栈中依然可以看到。

try(//获取资源1,获取资源2){
    //逻辑执行
}

综上所述,建议在涉及到资源关闭时,优先采用try-with-resource的写法,避免异常被完全取代,影响对于代码的调试及异常的准确捕获。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。