这是我参与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的写法,避免异常被完全取代,影响对于代码的调试及异常的准确捕获。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。