软件构造:异常处理之try-with-resource

目录

前言:

一、打开了一个流(非多重嵌套流)

二、打开了一个多重嵌套流

三、同时打开多个流


前言:

        在异常处理中,要想关闭在异常发生前申请的某些资源,通常需要使用try-catch-finally语法,分为三种情况:

一、打开了一个流(非多重嵌套流)

        那么只需要在finally中简单调用close()即可;

InputStream in = null;
try
{
    in = new FileInputStream("text.txt");
    //code that might throw exceptions
}
catch(IOException e)
{
    e.printStackTrace();
}
finally
{
    in.close();
}

二、打开了一个多重嵌套流

        所谓多重嵌套流,就是在一个流的打开需要另一个流。从表面上看,多重嵌套流需要从内向外逐层关闭,但事实上因为Java中close()方法的实现包含多线程的情况,所以实际上只需要关闭最外层流即可;

BufferedInputStream bin = null;
try 
{
    bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
    //code that might throw exceptions
}
catch (IOException e) 
{
    e.printStackTrace();
}
finally 
{
    bin.close();
}          

三、同时打开多个流

        这时候关闭流就需要考虑顺序问题。先打开的流需要先关闭,在关闭的过程中可能出现关闭异常,故需要嵌套使用try-catch-finally。同时打开的流越多情况越复杂;

BufferedInputStream bin = null;
BufferedOutputStream bout = null;
try 
{
    bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
    bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")));
    //code that might throw exceptions
}
catch (IOException e) 
{
    e.printStackTrace();
}
finally 
{
    if (bin != null) 
    {
        try 
        {
            bin.close();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        finally 
        {
            if (bout != null) 
            {
                try 
                {
                    bout.close();
                }
                catch (IOException e) 
                {
                    e.printStackTrace();
                }
             }
         }
     }
}

        在Java7中,引入了一个新的语法try-with-resource,其书写格式如try(resource){ ... },对于放在圆括号中的resource,编译器会自动将其写入finally并调用close(),省去了手动编写finally的麻烦。以上例为例,可以发现代码变得紧凑简洁了许多:

BufferedInputStream bin = null;
BufferedOutputStream bout = null;
try(bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
    bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt"))))
{
    //code that might throw exceptions
}
catch (IOException e) 
{
    e.printStackTrace();
}

        编译器并不只为几个特定的几个流加上自动关闭,编译器只看try(resource = ...)中的对象是否实现了java.lang.AutoCloseable接口,如果实现了,就自动加上finally语句并调用close()方法。故凡是实现了这个接口的流,都可以用在try(resource)中。

你可能感兴趣的:(软件构造,java)