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();
           }
         }
       }
     }
    }
    搜索微信公众号“程序员考拉”,欢迎关注!
  • 相关阅读:
    JavaScript——DOM或以树形展示的Web页面
    数字金额大写和小写转换
    Jquery—Jquery异步功能实例
    哈希—— POJ 3349 Snowflake Snow Snowflakes
    字节和字符的差别
    Kali Linux 安全渗透教程&lt;第三更&gt;1.2 安全渗透所需工具
    Git基础
    LeetCode Implement Stack using Queues
    HDU 4421 Bit Magic(2-sat)
    js判段URL是否可用(js判段网络是否不可用)
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/9444555.html
Copyright © 2011-2022 走看看