zoukankan      html  css  js  c++  java
  • Java finally关键字

    关于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.<init>(Unknown Source)
           at java.io.FileInputStream.<init>(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();
           }
         }
       }
     }
    }
    搜索微信公众号“程序员考拉”,欢迎关注!
  • 相关阅读:
    SVN简介
    TFS简介
    UML简介
    C#++c1FlexGrid+帮助文档09
    vmware虚拟机 C硬盘空间 无损扩容 新测
    批处理命令中set定义的两种变量介绍 计算机基础知识
    ASP.NET获取网站根目录(路径)
    VMware(bridge、NAT、host-only、custom)含义
    spring3.0+Atomikos 构建jta的分布式事务
    在做了 BasePage 时: 只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 / / 节中包括
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/9444555.html
Copyright © 2011-2022 走看看