欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

相关标签: finally