在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。

 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。

为了确保一定能回收 try 块中打开的物理资源,异常处理机制提供了 finally 代码块,并且 Java 7 之后提供了自动资源管理(Automatic Resource Management)技术。

finally 语句可以与前面介绍的 try catch 语句块匹配使用,语法格式如下:

try {// 可能会发生异常的语句
} catch(ExceptionType e) {// 处理异常语句
} finally {// 清理代码块
}

对于以上格式,无论是否发生异常(除特殊情况外),finally 语句块中的代码都会被执行。此外,finally 语句也可以和 try 语句匹配使用,其语法格式如下:

try {// 逻辑代码块
} finally {// 清理代码块
}

使用 try-catch-finally 语句时需注意以下几点:

 异常处理语法结构中只有 try 块是必需的,也就是说,如果没有 try 块,则不能有后面的 catch 块和 finally 块;catch 块和 finally 块都是可选的,但 catch 块和 finally 块至少出现其中之一,也可以同时出现;可以有多个 catch 块,捕获父类异常的 catch 块必须位于捕获子类异常的后面;不能只有 try 块,既没有 catch 块,也没有 finally 块;多个 catch 块必须位于 try 块之后,finally 块必须位于所有的 catch 块之后。finally 与 try 语句块匹配的语法格式,此种情况会导致异常丢失,所以不常见。

一般情况下,无论是否有异常拋出,都会执行 finally 语句块中的语句,执行流程如下图所示。


try catch finally 语句块的执行情况可以细分为以下 3 种情况:

1 . 如果 try 代码块中没有拋出异常,则执行完 try 代码块之后直接执行 finally 代码块,然后执行 try catch finally 语句块之后的语句。

2 . 如果 try 代码块中拋出异常,并被 catch 子句捕捉,那么在拋出异常的地方终止 try 代码块的执行,转而执行相匹配的 catch 代码块,之后执行 finally 代码块。如果 finally 代码块中没有拋出异常,则继续执行 try catch finally 语句块之后的语句;如果 finally 代码块中拋出异常,则把该异常传递给该方法的调用者。

3 . 如果 try 代码块中拋出的异常没有被任何 catch 子句捕捉到,那么将直接执行 finally 代码块中的语句,并把该异常传递给该方法的调用者。

除非在 try 块、catch 块中调用了退出虚拟机的方法System.exit(int status),否则不管在 try 块或者 catch 块中执行怎样的代码,出现怎样的情况,异常处理的 finally 块总会执行。

通常情况下不在 finally 代码块中使用 return 或 throw 等导致方法终止的语句,否则将会导致 try 和 catch 代码块中的 return 和 throw 语句失效。

当 Windows 系统启动之后,即使不作任何操作,在关机时都会显示“谢谢使用”。下面编写 Java 程序使用 try catch finally 语句这个过程,代码如下:

import java.util.Scanner;public class Test04 {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("Windows 系统已启动!");String[] pros = { "记事本", "计算器", "浏览器" };try {// 循环输出pros数组中的元素for (int i = 0; i < pros.length; i++) {System.out.println(i + 1 + ":" + pros[i]);}System.out.println("是否运行程序:");String answer = input.next();if (answer.equals("y")) {System.out.println("请输入程序编号:");int no = input.nextInt();System.out.println("正在运行程序[" + pros[no - 1] + "]");}} catch (Exception e) {e.printStackTrace();} finally {System.out.println("谢谢使用!");}}
}

上述代码在 main() 方法中使用 try catch finally 语句模拟了系统的使用过程。当系统启动之后显示提示语,无论是否运行了程序,或者在运行程序时出现了意外,程序都将执行 finally 块中的语句,即显示“谢谢使用!”。输出时的结果如下所示。

Windows 系统已启动!
1:记事本
2:计算器
3:浏览器
是否运行程序:
y
请输入程序编号:
2
正在运行程序[计算器]
谢谢使用!
Windows 系统已启动!
1:记事本
2:计算器
3:浏览器
是否运行程序:
y
请输入程序编号:
5
谢谢使用!
java.lang.ArrayIndexOutOfBoundsException: 4at text.text.main(text.java:23)
Windows 系统已启动!
1:记事本
2:计算器
3:浏览器
是否运行程序:
asdfasd
谢谢使用!

Java try catch finally语句相关推荐

  1. 1.7 Java try catch finally语句

    在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行.例如,程序在 try 块里打开了一些物理资源(如数据库连接 ...

  2. 【Java基础篇】try catch finally语句包含return语句时的执行过程

    网上有很多人探讨Java中异常捕获机制try-catch-finally块中的finally语句是不是一定会被执行? 很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally ...

  3. java中return不运行的情况_Java中try catch finally语句中含return语句的执行情况总结-编程陷阱...

    前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...

  4. java中 如何用if_不在Java中使用if语句

    这是一个非常奇怪且非常具体的问题. 最终我正在尝试编写一个程序转换,它接受java源代码,并将其转换为不使用它(除其他外) >阵列 >循环 >用户定义的方法 >如果声明 这是我 ...

  5. java在td中怎么用if_不在Java中使用if语句

    这是一个非常奇怪且非常具体的问题. 最终我正在尝试编写一个程序转换,它接受java源代码,并将其转换为不使用它(除其他外) >阵列 >循环 >用户定义的方法 >如果声明 这是我 ...

  6. java中的sql语句书写_Java中sql语句之通配符*

    在java中执行SQL语句要特别注意通配符的问题,否则是不会成功的: 在ACCESS中的通配符是* 例:select  *  from student  where  name like  '张*' ...

  7. java finally方法_讲解Java编程中finally语句的使用方法

    讲解Java编程中finally语句的使用方法 在java中的finally关键一般与try一起使用,在程序进入try块之后,无论程序是因为异常而中止或其它方式返回终止的,finally块的内容一定会 ...

  8. Java的常用输入输出语句

    一.概述 输入输出可以说是计算机的基本功能.作为一种语言体系,java中主要按照流(stream)的模式来实现.其中数据的流向是按照计算机的方向确定的,流入计算机的数据流叫做输入流(inputStre ...

  9. java语言中if语句的基本语法_java中if语句有哪些形式和用法

    形式一:if语句 if语句是指如果满足某种条件,就进行某种处理.例如,小明妈妈跟小明说"如果你考试得了100分,星期日就带你去游乐场玩".这句话可以通过下面的一段伪代码来描述. 如 ...

最新文章

  1. C++实现大数的四则运算
  2. mysql凡人入门_3种PHP连接MYSQL数据库的常用方法
  3. python初学代码留个纪念
  4. 驱动框架7——使用gpiolib完成led驱动
  5. eos测试规格_希望您的测试更有效? 这样写您的规格。
  6. 通过德雷福斯模型探寻成长之路
  7. 个人vscode插件配置全记录
  8. 零基础学python图文版-杭州零基础学python图文版
  9. Dijkstra算法【模板】
  10. create-react-app 支持多入口
  11. 最牛逼android上的图表库MpChart(三) 条形图
  12. html最大化和最小化,电脑上最大化最小化图标变了怎么办
  13. 最棒的游戏制作软件VAM Virt A mate汉化 优秀豪华
  14. 理解加载class到JVM的时机
  15. 降压稳压器LM2596SX-ADJ技术参考
  16. vmware虚拟机复制文件后空间不足删除.cache文件夹
  17. H5 页面36种漂亮的CSS3网页按钮Button样式
  18. 【干货】python爬取《战狼2》电影短评论,生成图云
  19. 拼手气红包算法_线段切割法
  20. 数仓模型设计详细讲解

热门文章

  1. python getopt参数参数自动补全_如何在Python中使用getopt / OPTARG?如果给出过多的参数(9),如何转移参数?...
  2. 本科计算机专业在车辆段,机电与轨道车辆工程系2021届毕业生参加成都铁路局车辆段及电务段认知实习...
  3. Oracle函数的信息,Oracle中获取会话信息的两个函数分享
  4. 猎豹浏览器网页声音怎么关闭
  5. 如何管理QQ浏览器的扩展工具 QQ浏览器扩展工具的管理方法
  6. Unity3D下Linux平台播放RTSP或RTMP流
  7. 如何实现rtsp h265 转 rtmp (rtsp hevc 转 rtmp)并转发到CDN或自建服务器
  8. Ubuntu中MySQL的启动/关闭/重启
  9. Spring的ApplicationEvent的使用
  10. 固定布局(fixed layout)、流体布局(fluid layout)、弹性布局(elastic layout)、响应布局(responsive layout)理解和技巧归纳