异常捕获之try_catch_finally语句块执行顺序

异常是指java程序运行时(非编译)所发生的非正常情况或错误,java把程序发生的每个异常都封装到了一个对象来表示,所有异常的根类为java.lang.Throwable,Throwable有两个直接已知的子类:Error和Exception,Error是程序本省无法克服和恢复的严重问题,例如:内存溢出和线程死锁等系统问题。Exception是程序能够克服和恢复的问题,它又分为系统异常(unchecked异常)和普通异常(checked异常),系统异常可以处理也可以不做处理,针对普通异常编译器强制要求必须用try_catch语句块包裹或throws声明抛出异常,下面说一下针对普通异常里面语句块的执行顺序问题。

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class TestOrder {
    public static void main(String[] args) {
        System.out.println(exeOrder());
    }

    public static String exeOrder() {
        FileReader reader = null;
        try {
            System.out.println("aaa");
            reader = new FileReader("d:/a.txt");
            char c = (char) reader.read();
            System.out.println("bbb");
            return "try语句块";
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return "第一个catch语句块";
        } catch (IOException e) {
            e.printStackTrace();
            return "第二个catch语句块";
        } finally {
            System.out.println("finally块");
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            // return "finally语句块";
        }
    }
}

针对上面的程序,如果我的D盘中有一个a.txt的文本,程序执行结果为:

aaa
bbb
finallytry语句块

如果里面传入了一个不存在的文本,例如abc.txt,那么程序执行的结果为:

aaa
java.io.FileNotFoundException: d:\abc.txt (系统找不到指定的文件。)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:106)
    at java.io.FileInputStream.<init>(FileInputStream.java:66)
    at java.io.FileReader.<init>(FileReader.java:41)
    at cn.sxt.exception.TestOrder.exeOrder(TestOrder.java:16)
    at cn.sxt.exception.TestOrder.main(TestOrder.java:9)
finally块
第一个catch语句块

从上面的执行结果可以看出:
1.程序先执行try_catch语句块,给返回值赋值
2.执行finally
3.执行try或catch里面的return语句
这里要说明一下,一般情况下,finally语句块里面就写一些关闭资源的代码,不要写return语句,因为一旦finally语句块中有return语句,它就会覆盖try_catch语句块中的return语句。
注意:catch语句块要把父类异常放下面,子类异常放上面,如果次序颠倒,下面的catch语句块将永远也执行不到。

猜你喜欢

转载自blog.csdn.net/liyufu318/article/details/79845372