1、try块后面可以有多个catch块,当包含catch子句时finally子句是可选的,包含finally子句时,catch子句是可选的。
2、在try块中当程序发生异常时后面的代码不会执行,进入catch代码块,catch代码对异常处理完毕后,程序作出向后执行,不会因为异常而终止。
3、无论try块中是否发生异常,finally块都会执行,除了try-catch代码块中执行System.exit(0),表示退出当前的java虚拟机。
4、
(1)在try或catch中有return语句,finally代码块中没有return语句,finally代码块中的语句仍旧会执行,程序执行到return语句时,会将变量保存,待执行完finally语句后,再返回,finally块中的语句不会影响最终的返回值,但finally块中的语句会改变变量的值。
(2)当try-catch代码块中都含有return语句时,具体可以分为两种情况:当try代码块中没有异常时,会执行try代码块中的return语句(return语句后面不能在有代码,因为程序执行到return时就停止了),但是程序时先将try代码块中return的返回值保存下来,跳过catch代码块(因为没有异常),执行finally代码块,finally代码块可能回改变catch代码块中return语句返回的变量的值,但是不会改变返回值(因为返回值已经保存了),若此时finally代码块中有return语句会执行return语句,并返回此时的返回值,(因此尽量不要在finally内写return),若finally代码块中没有return语句,程序会结束,并返回之前保存的返回值。
总结为:finally代码块一定会执行,若finally代码块中有return最终返回的是finally代码块中的返回值;若finally代码块没有return语句,try代码块中没有异常时,会执行try代码块中的return语句;若finally代码块没有return语句,try代码块中有异常时,会执行catch代码块中的return语句(finally代码块仍然执行,但不会改变返回值)。
1中的示例:
try代码块后可以添加多个catch代码块,finally代码块为可选的
try {
程序代码1
}catch(异常类型1 e1) {
程序代码2
}catch(异常类型2 e2) {
程序代码3
}catch(异常类型3 e3) {
程序代码4
}
try代码块后不加catch块,只有finally代码块
try {
程序代码1
}finally {
程序代码5
}
try代码块后添加多个catch代码块,和一个finally代码块
try {
程序代码1
}catch(异常类型1 e1) {
程序代码2
}catch(异常类型2 e2) {
程序代码3
}catch(异常类型3 e3) {
程序代码4
}finally {
程序代码5
}
2对应的示例:
public class TestTryCatch {
public static int div(int a, int b) {
return a/b;
}
public static void main(String[] args) {
System.out.println("异常捕获开始");
try {
int val = div(10, 0);// 此处出现异常,后面的代码不会执行
System.out.println(val);
}catch(ArithmeticException e) {
System.out.println("捕获到了异常"+e);
return;//catch块中有return语句,finally块仍然会执行
}finally {
System.out.println("开始执行finally代码块");
}
}
}
结果:
异常捕获开始
捕获到了异常java.lang.ArithmeticException: / by zero
开始执行finally代码块
3对应的示例:
package exception;
public class TestTryCatch {
public static int div(int a, int b) {
return a/b;
}
public static void main(String[] args) {
System.out.println("异常捕获开始");
try {
int val = div(10, 0);// 此处出现异常,后面的代码不会执行
System.out.println(val);
}catch(ArithmeticException e) {
System.out.println("捕获到了异常"+e);
System.exit(0);
System.out.println("能不能执行");
return;//catch块中有return语句,finally块仍然会执行
}finally {
System.out.println("开始执行finally代码块");
}
}
}
结果:
异常捕获开始
捕获到了异常java.lang.ArithmeticException: / by zero
finally块没有执行。
4对应的示例:
package exception;
public class TestFinally01 {
public static int get(){
int x =1;
try{
++x;
return x;
}finally {
++x;
System.out.println("finally:"+x);
}
}
public static void main(String[] args){
System.out.println("最终返回值:"+get());
}
}
结果:
finally:3
最终返回值:2
finally块改变了变量x的值,并没有改变返回值。