1、try和finally块中都有return
public static void main(String[] args) {
System.out.println(m1());
}
static int m1() {
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
System.out.println("m1() finally");
return 3;
}
}
返回结果
m1() finally
3
当finally块中return语句时,将会覆盖其他语句块的return。
2、finally块中没有return
public static void main(String[] args) {
System.out.println(m2());
}
static int m2() {
int result = 1;
try {
result = 2;
return result;
} catch (Exception e) {
return 0;
} finally {
result = 3;
System.out.println("m2() finally");
}
}
运行结果
m2() finally
2
程序在执行到return时首先将返回值存储在一个指定的位置,其次去执行finally块,finalyy块对值的修改不起作用。返回之前缓存的值。
3、try块异常
public static void main(String[] args) {
System.out.println(m3());
}
static int m3() {
try {
int i = 5 / 0;
System.out.println("1");
return i;
} catch (Exception e) {
System.out.println("2");
return 2;
} finally {
System.out.println("3");
return 3;
}
}
执行结果
2
3
3
4、try块之前异常,finally不执行
public static void main(String[] args) {
System.out.println(m4());
}
static int m4() {
int i = 10 / 0;
try {
System.out.println("1");
return i;
} catch (Exception e) {
System.out.println("2");
return 2;
} finally {
System.out.println("3");
return 3;
}
}
执行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero
at TestString.m3(TestString.java:16)
at TestString.main(TestString.java:12)
如果在try语句块之前报错,就直接报错。
5、try块中有System.exit(0)
public static void main(String[] args) {
System.out.println(m5());
}
static int m5() {
try {
System.out.println("1");
System.exit(0);
return 1;
} catch (Exception e) {
System.out.println("2");
return 2;
} finally {
System.out.println("3");
return 3;
}
}
运行结果:
1
当程序在try块中System.exit(0),强制退出时也不会去执行finally块中的代码。