1. 至少有两种情况下finally语句是不会被执行的:
(1)try语句没有被执行到,如在try语句之前return就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。
-->1.案例如下:
1 package com.himi.finallydemo; 2 3 public class FinallyDemo2 { 4 5 public static void main(String[] args) { 6 System.out.println(getInt()); 7 8 } 9 10 public static int getInt() { 11 int a = 10; 12 try { 13 System.exit(0); 14 System.out.println(a / 0); 15 a = 20; 16 17 } catch (ArithmeticException e) { 18 a = 30; 19 // return a; 20 } finally { 21 a = 40; 22 } 23 24 return a; 25 } 26 27 }
运行效果如下:
上面的getInt()方法中,先执行int a = 10;然后再执行try语句,发现开始就是System.exit(0),这样虚拟机jvm直接退出,随意不会印出任何信息。
-->2. 案例如下:
1 package com.himi.finallydemo; 2 3 public class FinallyDemo2 { 4 5 public static void main(String[] args) { 6 System.out.println(getInt()); 7 8 } 9 10 public static int getInt() { 11 int a = 10; 12 try { 13 System.out.println(a / 0);//执行完,直接跳转到第17行 14 System.exit(0); 15 a = 20; 16 17 } catch (ArithmeticException e) { 18 a = 30; 19 // return a; 20 } finally { 21 a = 40; 22 } 23 24 return a; 25 } 26 27 }
运行如下效果:
这里在try语句中执行System.out.println(a / 0),系统会马上捕获到异常直接执行catch语句,然后执行finally语句,最后return a
(此时a是40)
-->3.案例:
1 package com.himi.finallydemo; 2 3 public class FinallyDemo2 { 4 5 public static void main(String[] args) { 6 System.out.println(getInt()); 7 8 } 9 10 public static int getInt() { 11 int a = 10; 12 try { 13 System.out.println(a / 0); 14 System.exit(0); 15 a = 20; 16 17 } catch (ArithmeticException e) { 18 a = 30; 19 return a; 20 /* 21 * return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。 22 * 但是呢,它发现后面还有finally,所以继续执行fianlly的内容,a=40 23 * 再次回到以前的返回路径,继续走return 30; 24 */ 25 } finally { 26 a = 40; 27 //return 40;//如果这样结果就是40 28 } 29 30 return a; 31 } 32 33 }
运行效果如下:
时间: 2024-10-18 05:04:06