try、catch、finally语句块的作用
-》try 块:用于捕获异常
1、后面可以有0个或多个catch块
2、try块后面如果没有catch块,必须有一个finally块
3、执行代码捕获异常后进入catch块,try中出现异常代码处后面的代码不会再继续执行
-》catch 块:用于处理try捕获到的异常
1、可以有多个catch块
2、匹配到一个catch块后,其他catch块不会被执行
3、执行完毕后,如果有finally块,则进入finally块,finally之后的语句也继续执行
-》finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行
1、当try块中或者catch块中遇到return语句时,先执行完finally中的代码,再执行return语句
2、如果有return语句,执行完finally后, finally之后的语句不会再被执行
try、catch、finally语句块的执行顺序
public void try_catch_finally() {
try {
//代码a:代码执行区域
} catch (Exception e1) {
//代码b1:异常处理区域
}catch (Exception e2) {
//代码b2:异常处理区域
}finally {
//代码c:有无异常都需要执行的代码块
}
//代码d:其它内容
}
总结:
1)当try没有捕获到异常时:try语句块的语句逐一执行,程序跳过catch语句块,执行finally语句块和其后的语句;
2)当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,catch语句块执行完后,执行finally语句块里的语句。
3)若catch语句块里没有处理此异常的情况:此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行
return语句对执行顺序的影响
public String try_catch_finally() {
try {
return("try");
} catch (Exception e) {
return("catch");
}
}
public String try_catch_finally() {
try {
return("try");
} catch (Exception e) {
return("catch");
} finally {
System.out.print("finally");
}
}
public String try_catch_finally() {
try {
return("try");
} catch (Exception e) {
return("catch");
} finally {
return ("finally");
}
}
public class test {
static int x = 10;
static int y = 20;
static int z = 30;
public static void main(String[] args) {
int finallyValue = finallyReturn();
System.out.println("finallyValue=" + finallyValue); //31
System.out.println("x=" + x); // 11
System.out.println("y=" + y); // 20
System.out.println("z=" + z);// 31
}
private static int finallyReturn() {
try {
return ++x;
} catch (Exception e) {
return ++y;
} finally {
return ++z;
}
}
}
import java.util.ArrayList;
public class test {
public static String value="";
public static void finallyReturn(boolean flag){
try{
if(flag){
throw new Exception();
}
value+="1";
} catch(Exception e){
value+="2";
return;
} finally{
value+="3";
}
value+="4";
}
public static void main(String args[]){
finallyReturn(true);
System.out.println(value);//13423
finallyReturn(false);
System.out.println(value);//134
ArrayList list = new ArrayList<>();
list.add(1);
}
}
finally不会执行的情况
1、try语句没有被执行到,如在try语句之前返回了,finally语句就不会执行
2、在try块中有System.exit(0)这样的语句,System.exit(0)将会终止Java虚拟机JVM,相当于整个程序停止



