关于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();
       }
     }
   }
 }
}
搜索微信公众号“程序员考拉”,欢迎关注!

Java finally关键字的更多相关文章

  1. Java 并发 关键字volatile

    Java 并发 关键字volatile @author ixenos volatile只是保证了共享变量的可见性,不保证同步操作的原子性 同步块 和 volatile 关键字机制 synchroniz ...

  2. 【转载】java final 关键字的几种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  3. 【转载】java static 关键字的四种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  4. [java]final关键字的几种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...

  5. [java]static关键字的四种用法

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...

  6. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  7. java的关键字与保留字

    1,Java 关键字列表 (依字母排序 共50组): abstract, assert, boolean, break, byte, case, catch, char, class, const(保 ...

  8. 深入java final关键字

    Java final关键字详解:https://blog.csdn.net/kuangay/article/details/81509164 深入java final关键字 用法注意点和JVM对其进行 ...

  9. Java Synchronized 关键字

    本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchron ...

  10. java transient关键字作用,使用场景。

    java transient关键字作用,使用场景. 2016年08月31日 15:31:10 阅读数:4280 transient的作用及使用方法,官方解释为: Variables may be ma ...

随机推荐

  1. JOISC2019Day 1試験 (Examination)

    题面 官网 题解 就是个裸的三维数点,\(CDQ\)直接套上去就行了 //minamoto #include<bits/stdc++.h> #define R register #defi ...

  2. 列表的操作,元组,range; enumerate

    一.列表: 1. 什么是列表 列表是一个可变的数据类型 ,列表由[]来表示, 每一项元素使用逗号隔开. 列表什么都能装. 能装对象的对象. 列表可以装大量的数据 2. 列表的索引和切片 列表和字符串一 ...

  3. LAMPer 技能树

  4. spring里面的ioc的理解?

    spring里面的ioc就是控制反转,其实现核心是DI(依赖注入),控制反转不向以前java代码里面,通过new关键字来实现创建对象,这样每段代码之间的耦合度就比较高,为了降低每个小模块之间的耦合度, ...

  5. ExclusiveTouch

    Setting this property to true causes the receiver to block the delivery of touch events to other vie ...

  6. php获取随机字符串的几种方法

    方法一:shuffle函数(打乱数组)和mt_rand函数(生成随机数,比rand速度快四倍) /** * 获得随机字符串 * @param $len 需要的长度 * @param $special ...

  7. php中签名公钥、私钥(SHA1withRSA签名)以及AES(AES/ECB/PKCS5Padding)加密解密详解

    由于http请求是无状态,所以我们不知道请求方到底是谁.于是就诞生了签名,接收方和请求方协商一种签名方式进行验证,来取得互相信任,进行下一步业务逻辑交流. 其中签名用得很多的就是公钥私钥,用私钥签名, ...

  8. P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)

    $ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...

  9. spider_keeper定时任务

    # Define apscheduler app 下的 __init__.py 文件中, 三个主要函数

  10. JAVA中 package 和 import 的使用

    1.打包--package 包名一般为小写,而类名的第一个字母一般为大写,这样在引用时,可以明显的分辨出包名和类名.如果在类的定义之前没有使用package定义包名,那么该类就属于缺 省的包. 1.1 ...