正确关闭流方式
先来看一些错误示范☃️☃️
以下假设有两个输出流对象:oa ob
在使用他们之前,也就是进入try语句之前,都执行了初始化操作:
ObjectOputStream oa = null;
ObjectOputStream ob = null;
finally{
oa.close();
ob.close();
}
安全吗?
当然是不安全😏程序在开始的时候指定oa和ob 为null,完全有可能在程序运行的过程中初始化oa和ob之前发生了异常,那么oa和ob都还没有来得及初始化,因此oa和ob根本无法关闭
那么你可能会这么改:
finally{
if(oa != null){
oa.close();
}
if(ob != null){
ob.close();
}
}
安全吗?
答案当然又是否定的,这并不安全!
有没有一种可能,在关闭oa的时候发生了异常,结果程序就直接在oa这里非正常退出了,那ob关闭的语句就相当于压根就没有执行🥲🥲🥲
安全版
finally{
if(oa != null){
try{
oa.close();
}catch(Exception e){
...
}
}
if(ob != null){
try{
ob.close();
}catch(Exception e){
...
}
}
}
总结⭐⭐⭐
安全关闭方式要保证三点
1.使用finally关闭,保证关闭操作总是会被执行
2.关闭每个资源之前首先要保证引用该资源的引用变量不为null
3.为每个物理资源使用单独的try…catch块来关闭,保证关闭资源引发的异常不会影响到其他资源的关闭