博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java finally关键字
阅读量:5063 次
发布时间:2019-06-12

本文共 2584 字,大约阅读时间需要 8 分钟。

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

转载于:https://www.cnblogs.com/naihuangbao/p/9444555.html

你可能感兴趣的文章
mysql binlog配置详解
查看>>
python 下载整个站点
查看>>
三个摘要
查看>>
Java 测试并行编程(三)
查看>>
history for html5
查看>>
Java并发:volatile内存可见性和指令重排
查看>>
java学习面向对象之接口
查看>>
(笔试题)不用除法操作符,实现两个整数的除法
查看>>
oracle 安装需要注意的问题
查看>>
Mysql慢日志
查看>>
延迟环境变量扩展(bat)
查看>>
Linux笔记
查看>>
Arrays.toList工具类
查看>>
Git的使用--打tag
查看>>
第三模块-第一章笔记(类实例化篇)
查看>>
jq实现置顶
查看>>
F# 编程 借助 F# 构建 MVVM 应用程序
查看>>
ACFUN切换代码自用。。。
查看>>
网卡流量检测.py
查看>>
【转】Android的权限permission
查看>>