异常捕获机制

来源:互联网 发布:软件机器人 编辑:程序博客网 时间:2024/06/16 19:43

1、try-catch-finally执行顺序

public static int MyException() {    int i = 10;    try {        System.out.println("try block:" + i);// 10        return --i;// 9,存入临时栈    } catch (Exception e) {        System.out.println("catch block:" + i);        return --i;    } finally {        System.out.println("finally block:" + i);// 9        return --i;// 8,返回    }}
public static void main(String[] args) {    System.out.println("my exception is: " + MyException());}

输出:

try block10finally block9my exception is: 8

try块未发现异常,则执行finally块,即try-finally。

public static int MyException() {    int i = 10;    try {        int a = 1 / 0;// 发生异常,直接转至catch        System.out.println("try block:" + i);// 不执行        return --i;// 不执行    } catch (Exception e) {        System.out.println("catch block:" + i);// 10        return --i;// 9,存入临时栈    } finally {        System.out.println("finally block:" + i);// 9        return --i;// 8,返回    }}

输出:

catch block10finally block9my exception is: 8

try块抛出算术异常,立刻跳入catch块,然后执行finally,即try-catch-finally。

对于语句中的return语句,为执行finally块之前,return的值都存放在临时栈中,只有执行完finally之后,才真正的返回。

public static int MyException() {    int i = 10;    try {        System.out.println("try block:" + i);// 10        return i--;// 10,存入临时栈,然后--,i变为9    } catch (Exception e) {        System.out.println("catch block:" + i);    } finally {        System.out.println("finally block:" + i);// 9    }}

最终返回10

2、finally不会被执行的情况

1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU。

3、throws和throw

1)throws
throws语句用在方法定义时,声明该方法要抛出的异常类型。

2)throw
throw总是出现在函数体中,用来抛出一个Throwable类型的异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。