关于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. CTSC2017酱油记

    恩..又是一篇酱油记.. 自从SHTSC完之后都在复习地理高考..根本没有刷题.. 于是就来CTSC了..因为奇怪的实验考..APIO又不能参加..只能拿一块Fe了.. DAY0 恩..不存在DAY0 ...

  2. 洛谷P4548 [CTSC2006]歌唱王国(概率生成函数)

    题面 传送门 给定一个长度为\(L\)的序列\(A\).然后每次掷一个标有\(1\)到\(m\)的公平骰子并将其上的数字加入到初始为空的序列\(B\)的末尾,如果序列B中已经出现了给定序列\(A\), ...

  3. MongoDB 学习笔记四 C#调用MongoDB

    驱动 下载 https://github.com/mongodb/mongo-csharp-driver/downloads 项目地址: https://github.com/mongodb/mong ...

  4. XMPP后台搭建

    XMPP的环境搭建 1.下载MySQL 登录myql官网,点击页面下面的按钮 然后安装. 2.安装MySQL图形化管理工具mysql-workbench 同样进入mysql的官网, 下载 http:/ ...

  5. Jupyter Notebook远程服务器配置[转]

    首先要生成密码,打开python终端. In [1]: from IPython.lib import passwd In [2]: passwd() Enter password: Verify p ...

  6. Swift和Objective C关于字符串的一个小特性

    一.Unicode的一个小特性 首先,Unicode规定了许多code point,每一个code point表示一个字符.如\u0033表示字符"3",\u864e表示字符&qu ...

  7. python使用python-docx导出word

    #!/usr/bin/env python # -*- coding: utf-8 -*- ''' ''' from docx import Document from docx.shared imp ...

  8. Python导模块问题

    我们在import一个模块的时候,有没有想过如果我重复的import会怎么样?导入时都做了些什么?让我们来看看 1.首先我们新建一个demo,py,里面只有一句输出语句 2.多次导入demo,运行之后 ...

  9. fetch网络请求 get 和 post

    //在React Native中,使用fetch实现网络请求 /* fetch 是一个封装程度更高的网络API, 使用了Promise* Promise 是异步编程的一种解决方案* Promise 对 ...

  10. Jmeter将JDBC Request查询结果作为下一个接口参数方法(转载)

    现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口. tieba_ ...