放在finally内部与程序最后面的区别

点击:264  日期:2018-12-01 21:01:08.0 [Java]

之前我做java程序有过这样的疑问,finally到底有什么用,不用finally,把要执行的程序直接放在try、catch块的后面不也一样执行吗?用finally的意义在哪里呢?经过长时间的开发,也遇到了不少问题和累计了一些经验。下面就说说finally的意义。

下面是一个读取文件的例子,并不一定实用,只为了说明finally。

Finally.java

import java.io.IOException;
import java.io.InputStream;

public class Finally {

    public int  inShunxu(String file) {

        InputStream is = null;

        try {
            is = Finally.class.getResourceAsStream(file);
            
            if(is==null) {
                return -1;
            }
            
            byte[] bytes = new byte[0];
            bytes = new byte[is.available()];

            if (bytes.length == 0) {
                return 0;
            }
            
            is.read(bytes);
            String str = new String(bytes);
            System.out.println(str);
        } catch (Exception e) {

            System.out.println(e.getMessage());
            return -2;
        }

        System.out.println("我可能不被执行");
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return 1;

    }

    public int  inFinally(String file) {
        InputStream is = null;

        try {
            is = Finally.class.getResourceAsStream(file);
            
            if(is==null) {
                return -1;
            }
            
            byte[] bytes = new byte[0];
            bytes = new byte[is.available()];

            if (bytes.length == 0) {
                return 0;
            }
            
            is.read(bytes);
            String str = new String(bytes);
            System.out.println(str);
        } catch (Exception e) {

            System.out.println(e.getMessage());
            return -2;
        }finally{

            System.out.println("我一定被执行");
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return 1;
    }
    

    public static void main(String[] args) {
        Finally f = new Finally();
        //文件正常
        System.out.println(f.inShunxu("finally.txt"));
        System.out.println("----------------");
        System.out.println(f.inFinally("finally.txt"));
        System.out.println("++++++++++++++++");
        //文件异常
        System.out.println(f.inShunxu("finally11.txt"));
        System.out.println("----------------");
        System.out.println(f.inFinally("finally11.txt"));
    }
}


运行结果

finally测试文件
我可能不被执行
1
----------------
finally测试文件
我一定被执行
1
++++++++++++++++
-1
----------------
我一定被执行
-1

从运行我们可以发现,如果在try和catch中有return是很危险的,因为这样后面的程序就不会被执行。只有放在finally里的才能在return前执行。如果一些必须执行的代码,如例子中的关闭文件流。所以放在finally中保证了代码的执行安全。

总结finally的有点:

1、代码安全,一定会执行,保证程序的正常逻辑。否则自己认为执行了结果没有,这种错误也很难发现。

2、代码可读性强,很容易就区分哪里是正常代码,哪里是异常,哪里是最后的收尾程序。

3、代码相关性好,try、catch、finally 是一体,这样我们就知道finally中的代码与其他无关,否则如果代码很多我们无法区分那个是一组的,很混乱不利于维护。