try、catch、finally执行顺序
原文链接:try、catch、finally执行顺序 | 柳门竹巷 (zhbblog.top)
try中有return
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+test());
}
public static int test(){
int num = 0;
try {
System.out.println("进入--> try ");
num = 1;
System.out.println("try方法--> num=" + num);
return num;
} catch (Exception e) {
System.out.println("进入--> catch ");
num = 2;
System.out.println("catch方法--> num=" + num);
} finally {
System.out.println("进入--> finally ");
num = 3;
System.out.println("finally方法--> num=" + num);
}
return num;
}
}
// 输出结果:
// 进入--> try
// try方法--> num=1
// 进入--> finally
// finally方法--> num=3
// 返回结果:1
catch中有return
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+test());
}
public static int test(){
int num = 0;
try {
System.out.println("进入--> try ");
// 产生异常
int i = 1/0;
num = 1;
System.out.println("try方法--> num=" + num);
return num;
} catch (Exception e) {
System.out.println("进入--> catch ");
num = 2;
System.out.println("catch方法--> num=" + num);
return num;
} finally {
System.out.println("进入--> finally ");
num = 3;
System.out.println("finally方法--> num=" + num);
}
}
}
// 输出结果:
// 进入--> try
// 进入--> catch
// catch方法--> num=2
// 进入--> finally
// finally方法--> num=3
// 返回结果:2
finally中有return
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+test());
}
public static int test(){
int num = 0;
try {
System.out.println("进入--> try ");
num = 1;
System.out.println("try方法--> num=" + num);
// 产生异常
int i = 1/0;
return num;
} catch (Exception e) {
System.out.println("进入--> catch ");
num = 2;
System.out.println("catch方法--> num=" + num);
return num;
} finally {
System.out.println("进入--> finally ");
num = 3;
System.out.println("finally方法--> num=" + num);
return num;
}
}
}
// 输出结果:
// 进入--> try
// try方法--> num=1
// 进入--> catch
// catch方法--> num=2
// 进入--> finally
// finally方法--> num=3
// 返回结果:3
return的值为对象
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+ArrayUtil.toString(test()));
}
public static List<String> test(){
List<String> list = new ArrayList<>();
try {
System.out.println("进入--> try ");
list.add("try");
System.out.println("try方法--> list=" + ArrayUtil.toString(list));
// 产生异常
int i = 1/0;
return list;
} catch (Exception e) {
System.out.println("进入--> catch ");
list.add("catch");
System.out.println("catch方法--> list=" + ArrayUtil.toString(list));
} finally {
System.out.println("进入--> finally ");
list.add("finally");
System.out.println("finally方法--> list=" + ArrayUtil.toString(list));
}
return list;
}
}
// 输出结果:
// 进入--> try
// try方法--> list=[try]
// 进入--> catch
// catch方法--> list=[try, catch]
// 进入--> finally
// finally方法--> list=[try, catch, finally]
// 返回结果:[try, catch, finally]
程序退出或其他导致程序中断
public class Test {
public static void main(String[] args) throws IOException {
System.out.println("返回结果:"+test());
}
public static int test(){
int num = 0;
try {
System.out.println("进入--> try ");
// 退出程序
System.exit(0);
num = 1;
System.out.println("try方法--> num=" + num);
return num;
} catch (Exception e) {
System.out.println("进入--> catch ");
num = 2;
System.out.println("catch方法--> num=" + num);
return num;
} finally {
System.out.println("进入--> finally ");
num = 3;
System.out.println("finally方法--> num=" + num);
return num;
}
}
}
// 输出结果:
// 进入--> try
总结:
- 执行顺序:try --> catch(如果有异常)--> finally --> finally中的return --> try/catch中的return
- finally中有return时,会直接在finally中退出,导致try、catch中的return失效
- finally不一定会被执行,比如手动调用System.exit(0)或栈溢出、内存溢出等其他导致程序中断的情况
- 需要注意return返回值的类型,是否会受到finally中代码的影响
- 如果是基本数据类型:当try中带有return时,会先执行return前的代码,然后暂时保存需要return的信息,再执行finally中的代码,最后再通过return返回之前保存的信息
- 如果是对象:return中保存的是对象的引用地址,当在finally中改变对象的属性时,return返回的对象也会跟着改变