try {
需要检查的代码(可能会抛出异常,也可能不会抛出异常,抛出异常后就去执行catch代码块)
} catch(异常的类型 异常类型的变量) {
捕获异常后要处理异常,只有出现异常时才被执行
} finally {
一定会被执行的代码(不管异常抛不抛出都会执行)
}
try 的代码块内如果抛出异常会跳过剩余的代码去执行 catch 代码块
finally语句可以省略,如果不省略即使前面执行了return语句也会等finally代码块执行完后再返回
下面是有关try-catch和finally用法的例题,便于理解他们的关系,做做看
public class TryCatchFinally {
static int x = 1;
static int y = 10;
static int z = 100;
public static void main(String[] args) {
int value = finallyReturn();
System.out.println("value=" + value);
System.out.println("x=" + x); // 2
System.out.println("y=" + y); // 10
System.out.println("z=" + z);// 101
}
private static int finallyReturn() {
try {
// ...
return ++x;
} catch (Exception e) {
return ++y;
} finally {
return ++z;
}
}
}
你做对了吗?
代码执行过程:
调用 finallyReturn()函数,执行 try 代码块 return ++x,返回x(由于有finally语句,不会直接返回,相当于放缓存区,等执行完finally语句再返回),此时x=2,因为return语句,不会执行 catch 代码块,y不变(y=2),但会执行 finally 代码块,return ++z,此时z=101,而且return ++z会覆盖前面try的return ++x,所以最后结果为value=101
x=2
y=10
z=101
再来一题,考考自己
import java.util.ArrayList;
public class FinallyDemo {
public static String output="";
public static void foo(int i){
try{
if(i==1){
throw new Exception();
}
output+="1";
} catch(Exception e){
output+="2";
return;
} finally{
output+="3";
}
output+="4";
}
public static void main(String args[]){
foo(0);
System.out.println(output);//134
foo(1);
System.out.println(output);//13423
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
}
}
结果如下,这次你做对了吗: