finally之关闭流的正确姿势
程序员文章站
2024-03-20 18:32:58
...
public static void main(String[] args) {
try {
System.out.println("00000");
}catch (Exception e){
}finally {
try {
System.out.println("1111");
throw new RuntimeException();
}catch (Exception e){
System.out.println("error111");
e.printStackTrace();
}
try {
System.out.println("22222");
}catch (Exception e){
System.out.println("error2222");
}
}
}
打印
00000
java.lang.RuntimeException
1111
at Client.main(Client.java:63)
error111
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
22222
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
可以看出打印的顺序为
0000
1111
error111
22222
那么就可以知道在finally之中即使抛出异常也会继续执行下去
所以在关闭流的时候
正确的用法是
try{
if(is != null){
is.close();
}
}catch(Exception e){
logger.error("关闭输入流错误!", e);
}
try{
if(os != null){
os.close();
}
}catch(Exception e){
logger.error("关闭输出流错误!", e);
}
错误的写法是这样的
try{
is.close();
os.close();
}catch(Exception e){
logger.error("关闭流错误!", e);
}
因为is关闭错误的时候 os就不会正确关闭,那么内存泄露 流未关闭,会导致文件正在使用中。。。。其它流并不能操作。。。
也可以使用jdk1.7的新特性
try with resources
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html