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();
}
}
}
}
}
搜索微信公众号“程序员考拉”,欢迎关注!
Java finally关键字的更多相关文章
- Java 并发 关键字volatile
Java 并发 关键字volatile @author ixenos volatile只是保证了共享变量的可见性,不保证同步操作的原子性 同步块 和 volatile 关键字机制 synchroniz ...
- 【转载】java final 关键字的几种用法
原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...
- 【转载】java static 关键字的四种用法
原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...
- [java]final关键字的几种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...
- [java]static关键字的四种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...
- [Java并发编程(三)] Java volatile 关键字介绍
[Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...
- java的关键字与保留字
1,Java 关键字列表 (依字母排序 共50组): abstract, assert, boolean, break, byte, case, catch, char, class, const(保 ...
- 深入java final关键字
Java final关键字详解:https://blog.csdn.net/kuangay/article/details/81509164 深入java final关键字 用法注意点和JVM对其进行 ...
- Java Synchronized 关键字
本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchron ...
- java transient关键字作用,使用场景。
java transient关键字作用,使用场景. 2016年08月31日 15:31:10 阅读数:4280 transient的作用及使用方法,官方解释为: Variables may be ma ...
随机推荐
- ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn't want to study
死于update的一个long long写成int了 真的不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/ ...
- [AIR] AS3读取txt文档
package { import flash.display.Sprite; import flash.events.Event; import flash.filesystem.File; impo ...
- java内存模型(jMM)(一)
在说java的内存模型之前先简单的了解计算机的主存和缓存的相关概念. 多任务和高并发是衡量一台计算机处理器的重要指标.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions P ...
- ExclusiveTouch
Setting this property to true causes the receiver to block the delivery of touch events to other vie ...
- Corn表达式
CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表.CronTr ...
- 简明依赖注入(Dependency Injection)
前言 这是因特奈特上面不知道第几万篇讲依赖注入(Dependency Injection)的文章,但是说明白的却寥寥无几,这篇文章尝试控制字数同时不做大多数. 首先,依赖注入的是一件很简单的事情. 为 ...
- POJ3349 Snowflake Snow Snowflakes (JAVA)
首先声明代码并没有AC,内存超了 但我对此无能为力,有没有哪位大神好心教一下怎么写 哈希,然后比较花瓣数组,这些应该都没问题才对..唉.. 贴MLE代码 import java.util.*; pub ...
- px,em, rem的区别,在项目中怎么使用rem.
一.px px像素,绝对单位.像素px是相对于显示器屏幕分辨率而言的,是一个虚拟的长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度单位,需要指定精度DPI. 二.em em是相对长 ...
- 【Python】二进制转ASCII码小脚本
#coding:utf-8 #developed by carrypan! import binascii import optparse def main(): usage="%prog ...
- jquery加载单文件vue组件
/**注册组件 */ function registerComponent(name){ dm[name] = {}; Vue.component(name + '-component', funct ...