关于finally语句块,有如下特点:
1.finally语句块可以直接和try语句块联用。try...finally...
2.try...catch...finally也可以
3.通常在finally语句块中的代码是一定会执行的。
看以下例子:
import java.io.*; public class ExceptionTest08{ public static void main(String[] args){ try{ System.out.println("ABC"); return; }finally{ System.out.println("Test"); } } }
编译运行后输出:
ABC Test
通常来说return一执行,方法结束,也就是说return之后的代码不会再执行。但是由于后面跟的是finally语句块,上面讲过finally语句块一定会执行,因此System.out.println("Test");也会执行。
再看看以下例子:
import java.io.*; public class ExceptionTest08{ public static void main(String[] args)throws FileNotFoundException{ try{ FileInputStream fis=new FileInputStream("c:/ab.txt"); //出现异常 //由于上面代码出现异常,因此System.out.println("BASIC")不会执行。 System.out.println("BASIC"); }finally{ //在finally语句块中的代码一定会执行。 System.out.println("AAA"); } } }
编译运行后输出:
AAA Exception in thread "main" java.io.FileNotFoundException: c:\ab.txt (系统找不到指定的文件。) at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(Unknown Source) at java.io.FileInputStream.(Unknown Source) at java.io.FileInputStream. (Unknown Source) at ExceptionTest08.main(ExceptionTest08.java:36)
只有一种情况finally语句块是不会执行的。
import java.io.*; public class ExceptionTest08{ public static void main(String[] args){ try{ //退出Java虚拟机 System.exit(0); }finally{ System.out.println("AAA"); } } }
以上代码在try语句块中退出Java虚拟机,导致finally语句块中的内容不再执行。也就是说,只要在执行finally语句块之前退出了JVM,则finally语句块中的内容不再执行。
咱们再深入了解一下finally语句块。看以下例子:(在编译运行之前大家可以先分析一下输出的结果是什么)
public class ExceptionTest09{ public static void main(String[] args){ int i=m1(); System.out.println(i); } public static int m1(){ int i=10; try{ return i; }finally{ i++; System.out.println("m1的i="+i); } } }
编译运行后输出:
m1的i=11 10
来看看以上代码的执行原理:
public class ExceptionTest09{ public static void main(String[] args){ int i=m1(); System.out.println(i); //10 } public static int m1(){ int i=10; try{ int temp=i; return temp; }finally{ i++; System.out.println("m1的i="+i); //11 } } }
在主方法中调用m1()方法,首先执行m1()方法中的System.out.println("m1的i="+i),输出m1的i=11,之后执行主方法中的System.out.println(i); 输出10.
finally语句块还有一个作用,finally语句块是一定会执行的,所以通常在程序中,为了保证某资源一定会释放,一般在finally语句块中释放资源。
import java.io.*; public class ExceptionTest10{ public static void main(String[] args){ FileInputStream fis=null; try{ fis=new FileInputStream("ExceptionTest10.java"); }catch(FileNotFoundException e){ e.printStackTrace(); }finally{ //为了保证资源一定会释放,将释放资源的代码块放在finally语句块中。 if(fis!=null){ try{ fis.close(); }catch(IOException e){ e.printStackTrace(); } } } } } 搜索微信公众号“程序员考拉”,欢迎关注!