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 block:10
finally block:9
my 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 block:10
finally block:9
my 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块。