浅谈Java中try-catch-finally的执行顺序
一些结论
1.无论有没有出现异常,只要程序没有终止,finally块中的代码都会执行。
public class Try {
public static void main(String[] args) {
haha();
}
public static void haha(){
try {
System.out.println("1");
System.out.println("2");
System.out.println("3");
}catch (RuntimeException e){
}finally {
System.out.println("finally执行了");
}
}
}
此时是正常执行的,输出如下
如果程序在运行中终止呢?
public class Try {
public static void main(String[] args) {
haha();
}
public static void haha(){
try {
int a = 10;
int b = 0;
System.out.println(a/b);
}catch (RuntimeException e){
//退出JVM
System.exit(0);
}finally {
System.out.println("finally执行了");
}
}
}
此时是什么都没有输出的。
2.即使try和catch块中包含返回语句,finally块也仍然会执行。
public class Try {
public static void main(String[] args) {
haha();
}
public static int haha(){
try {
System.out.println("1");
System.out.println("2");
System.out.println("3");
return 1;
}catch (RuntimeException e){
return 0;
}finally {
System.out.println("finally执行了");
}
}
}
3.finally是在return语句执行后再执行的,此时并没有返回运算后的值,而是先把要返回的值保存起来,而返回值最终有没有改变需要根据finally块中的代码分两种情况。
//第一种:引用传递
public class Try {
public static void main(String[] args) {
Person p =haha();
System.out.println(p.age);
}
public static Person haha(){
Person p = new Person();
try {
p.age =18;
return p;
}catch (RuntimeException e){
return null;
}finally {
p.age=28;
}
}
static class Person{
int age;
}
}
输出结果如下:
这种情况return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
public class Try {
public static void main(String[] args) {
int i = haha();
System.out.println(i);
}
public static int haha(){
int age = 1;
try {
age = 2;
return age;
}catch (RuntimeException e){
return 0;
}finally {
age=3;
}
}
}
输出结果如下:
这种情况return的数据是基本数据类型,则在finally中对该基本数据的改变不起作用,try中的return语句依然会返回进入finally块之前保留的值。