finally之关闭流的正确姿势

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

你可能感兴趣的:(finally之关闭流的正确姿势)