- try/catch/finally 介绍
try:用来捕获异常
catch:用于处理try中捕获的异常
finally:无论是否捕获或处理异常,finally块中的代码都会被执行。
try必须有
finally可以无
try后面必须+一个或者多个catch | try后面+0个或者1个finally
try后面必须跟catch 或者 finally 其中之一
try后面可以有0个或者多个catch,只能有0个或者1个finally。
若try后面没有catch,则必须有一个finally
- try/catch/finally 执行顺序
情况1:里面均无return语句
try里面的代码执行
若try里面捕获了异常,则执行catch语句;否则不执行catch语句
1.若有多个catch块,当进入一个catch块,执行完毕后;
2.即使后面还有catch块,也不会再进入其他catch块。(类似if一样选择了一个catch,其他就会跳过)
3.如果有finally块,则进入finally块。
finally块一定会执行(不论释放出现异常)
情况2:里面加上return语句
当try块中或者catch块中遇到return语句时,先执行完finally里面的代码后,再执行return返回语句。
当finally里面有return语句,执行完finally后,直接执行finally里面的return语句,程序结束。(无论try或者catch里面是否有return语句都不会执行)
我们来举例说明:
1.try里有异常+finally里面无retun块 :先执行完finally里面的代码后,再执行return语句。
public static String testMain() {
int i = 0;
String s = null;
try {
System.out.println("我是try里面的语句");
// i /= 0;
System.out.println(s.length());//空指针异常
return "我是try里的return语句";
} catch (NullPointerException e) {
System.out.println("我是catch语句里面语句1");
return "我是catch语句里面的return语句1";
} catch (Exception e) {
System.out.println("我是catch语句里面语句2");
return "我是catch语句里面的return语句2";
}
finally {
System.out.println("我是finally里面的执行语句");
// return "我是finally里面的return语句";
}
}
//输出结果:
//我是try里面的语句
//我是catch语句里面语句1
//我是finally里面的执行语句
//我是catch语句里面的return语句1
2.try里无异常+finally里面无retun块 :先执行完finally里面的代码后,再执行return语句。
输出结果:
我是try里面的语句
我是finally里面的执行语句
我是try里的return语句
- try里面无异常+finally里有return:执行完finally后,直接执行finally里面的return语句,程序结束
public static String testMain() {
int i = 0;
String s = null;
try {
System.out.println("我是try里面的语句");
// i /= 0;
// System.out.println(s.length());//空指针异常
return "我是try里的return语句";
} catch (NullPointerException e) {
System.out.println("我是catch语句里面语句1");
return "我是catch语句里面的return语句1";
} catch (Exception e) {
System.out.println("我是catch语句里面语句2");
return "我是catch语句里面的return语句2";
}
finally {
System.out.println("我是finally里面的执行语句");
return "我是finally里面的return语句";
}
}
输出结果:
//我是try里面的语句
//我是finally里面的执行语句
//我是finally里面的return语句
4.try里面有异常 +finally里有return:执行完finally后,直接执行finally里面的return语句,程序结束
输出结果:
我是try里面的语句
我是catch语句里面语句1
我是finally里面的执行语句
我是finally里面的return语句
- 我们来做道题
最后程序输出 i=?
public int test() {
int i = 0;
try {
i++;
i = i / 0;
return i++;
} catch (Exception e) {
i++;
return i++;
} finally {
return ++i;
}
}
public static void main(String[] args) {
System.out.println(test());
}
答案:4
为什么是4呢?我前面不是说直接执行finally里面的return语句吗?
解释:
原来,我们try / catch里面的return语句不会被输出打印,但是程序还是会走这步的,只不过我们遇到return语句就代表程序结束,所以我们只能最后输出finally块里面的return语句。
4. 最后结论
任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。但是程序依然会走try/catch里面的retrun语句。