finally一定会执行吗?
答案:肯定不是。
第一种情况:程序未执行到 finally 块。
1.在执行 try 块之前直接 return,finally 块是不会执行的。
public class Test {
private static int total() {
int i = 11;
if (i == 11) {
return i;
}
try {
System.out.println("执行try");
} finally {
System.out.println("执行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println(">>>>>>>输出结果:" + total());
}
}
2.在执行 try 块之前程序直接报错,那么finally块自然就不会执行到了。
public class Test {
private static int total() {
return 1/0;
try {
System.out.println("执行try");
} finally {
System.out.println("执行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println(">>>>>>>输出结果:" + total());
}
}
3.在执行try块时,主动退出jvm。
public class Test {
private static int total() {
try {
System.exit(0);
}catch(Exception e){
System.out.println("执行catch");
}finally {
System.out.println("执行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println(">>>>>>>输出结果:" + total());
}
}
第二种情况:程序执行到 finally 块。
1.finally 块不含返回值。
预想的结果应该是1,结果返回了0。这是因为Java程序会把try或者catch块中的返回值保留,也就是暂时的确认了返回值,然后再去执行finally代码块中的语句。等到finally代码块执行完毕后,如果finally块中没有返回值的话,就把之前保留的返回值返回出去。
public class TryCatchTest {
private static int total() {
int i = 0;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
}
}
public static void main(String[] args) {
System.out.println(">>>>>>>>>输入结果:" + total());
}
}
2.finally 块含返回值。
预想的结果应该是1,结果也确实返回了1。
public class TryCatchTest {
private static int total() {
int i = 0;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
return i;
}
}
public static void main(String[] args) {
System.out.println(">>>>>>>>>输入结果:" + total());
}
}
或者
public class TryCatchTest {
private static int total() {
int i = 0;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
}
return i;
}
public static void main(String[] args) {
System.out.println(">>>>>>>>>输入结果:" + total());
}
}
在分析含有finally块的方法返回值时,要对于return出现的地方进行具体分析。在finally块中进行return操作的话,则方法整体的返回值就是finally块中的return返回值。如果在finally块之后的方法内return,则return的值就是进行完上面的操作后的return值。