异常处理中涉及到五个关键字:
- try:用于监听代码,将可能出现问题的代码放在try里,一旦检测到异常就会将其抛出
- catch:用于捕获异常,当try中的代码检测出问题,则会catch就会捕获
- throw:用于抛出异常,一般可以写在catch块中
- throws:用于抛出异常给上一级,用于方法上声明可能抛出的异常
还差最后一个就是本文的主角:
- finally:finally语句块一定会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
下边举例说明:
1、try catch中有return,finally中没有return
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test(){
int x = 1;
try{
return x;
}finally{
++x;
} }}
//返回结果为:1
执行结果为1,那么为什么是1呢,我开始也不是很理解,首先我们要知道return语句主要有两个用途:一方面用来表示一个方法返回的值,另一方面是指,它导致该方法退出,并返回那个值。由此看来,如果执行了return,那么方法就用退出了,这样一来finally是肯定不会答应的,因为Java规定了finally必须执行一次。因此,虽然执行了return,但发现finally还在等着呢,也不能输出结果呀,于是我们先悄悄把结果藏起来,然后执行一下finally,等finally跑完,我们将之前藏起来的结果返回,正式退出该方法。
2、try catch中有return,finally中也有return
public class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test(){
int x;
int a;
try{
System.out.println("try");
return a=1;
}finally{
System.out.println("finally");
return x=2;
} }}
//输出结果为:
try
finally
2
执行结果为2,和上边类似,try中return执行时,发现有finally还未执行,于是将a=1先放栈里,然后执行finally,但是万万没想到finally中也有return,更可气的是finally不讲究,直接将自己的return执行并输出结果x退出了方法。因此输出结果就成了2