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 ...
随机推荐
- Win8.1下安装sql server 2008 r2详解
我是来斗图的,安装了好多次,有一些配置还是不能烂熟于心啊,所以就想起来了米老师那句话,学习是个反复的过程.写个教程吧,很简单但是很实用. 首先打开"setup.exe"出现以下界面 ...
- windows系统作为客户端时,linux中本地yum源挂载时,如何同时挂载DVD1和DVD2?
这里以CentOS6.5为例.他的镜像有两个DVD1和DVD2.DVD1中是系统和主要的安装包,DVD2中是剩下的安装包 当挂载时如果要同时挂载DVD1和DVD2.需要这样做: 1)在虚拟机的设置中选 ...
- python 绘制抛物线
%matplotlib inlineimport matplotlib.pyplot as plt import numpy as npx = range(100) y = [val**2 for v ...
- CH5102 Mobile Service
CH5102 Mobile Service 描述 一个公司有三个移动服务员,最初分别在位置1,2,3处.如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去.某一时刻只有一 ...
- c语言-勒让德多项式求解+时间测定
#include<iostream>#include<ctime>#include<cstdlib>using namespace std; float LRD(i ...
- window下Ionic环境安装
安装以下文件 1.java.jdk 2apache ant 3.android skd 4.node 目前是这几个. 大该流程就是这样子的. Ionic官方教程: http://learn.ioni ...
- (USB HID) VC++ 使用 SetupAPI 操作 USB HID Device
在VC裡頭使用 Api必須include 跟加入 lib,加入之後就可以在VC裡頭任意使用api了 暫時先貼上程式碼...等待有空時候在更新說明 extern "C" { #inc ...
- 01迷宫 BFS
题目描述 有一个仅由数字000与111组成的n×nn \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格 ...
- 主流服务器虚拟化技术简单使用——Xen(一)
Tips:因为博客园网页布局的原因,部分图片显示不清晰,可以放大网页查看清晰图片. 如果系统使用物理机,需要在BIOS里面开启Intel VT-x(或AMD-V),如果是VMware workstat ...
- 接口自动化之unittest+ddt
我在上一篇(https://www.cnblogs.com/wlyhy/p/10083318.html) 文章整理了unittest的模板,但在后续学习中,发现还有许多值得优化的地方.例如在我们设计测 ...