• 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();
           }
         }
       }
     }
    }
    搜索微信公众号“程序员考拉”,欢迎关注!
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    深度学习入门笔记(十九):卷积神经网络(二)
    用Excel表达图片如何由像素点构成
    使用you-get爬取各大网站视频
    自从有了这样的可视化报表,我们社区再没有过疫情(内含福利)
    端口测试程序
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/9444555.html
Copyright © 2020-2023  润新知