总结的时候,发现finally还是个磨人的小妖精~~
没有进入try代码块
public class test {
public static void main(String[] args) {
func();
try {
System.out.println("start try catch");
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}finally {
System.out.println("after try catch");
}
}
public static void func() {
int[] arr = {1, 2, 3};
System.out.println(arr[100]);
}
}
你觉得上面这段代码的结果是啥呢?
执行结果如上图所示。因为根本就没有进入try代码块啊!!!finally代码块能够被执行,首先是能够进入try代码块。
程序被终止
1.调用了System.Exit
- 在try中调用了System.exit(),程序一定会被终止
public class test {
public static void main(String[] args) {
try {
System.out.println("start try catch");
System.exit(0);
} finally {
System.out.println("after try catch");
}
}
}
执行结果如图
-在catch代码块中catch到了对应的异常,调用System.exit(),也会终止程序。
public class test {
public static void main(String[] args) {
try {
System.out.println("start try catch");
System.out.println(10/0);
} catch (ArithmeticException e) {
e.printStackTrace();
System.exit(1);
} finally {
System.out.println("after try catch");
}
}
}
结果如下
守护线程中有finally代码块
当非守护线程运行结束,守护线程随之被终止,还没来得及运行finally代码块。
总结一下,凡是没有进入代码块或者程序被终止,包括,运行try/catch的时候断电了啥的,都不会运行到finally代码块。所以,finally代码块并不是一定会被执行的呦!!!
finally代码块中尽量不要出现return语句,因为finally中的return会覆盖掉前面catch
的每一个return。