Java try catch finally语句

在实际开发中,根据 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
谢谢使用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux代码_Sonar代码走查的配置(linux)

SonarQube是一个静态代码质量检查工具&#xff0c;可以检查出代码中明显或潜在问题。虽然偶尔它的判断会是错误的&#xff0c;但还是值得我们用。它能以比较基础的级别减少代码出错的可能&#xff0c;可以节省人工Review代码时间。它支持多种语言的检查。我这里的代码是java代码…

智能计算之粒子群算法(PSO)介绍

目录 1. 简介(思想) 2. 研究发展 3. 算法步骤 4. 应用举例 5. 粒子群优化算法的改进研究 5.1 理论改进 5.2 拓扑结构改进 5.3 混合算法改进 5.4 离散版本改进 6. 相关应用 7. 参数设置​ 1. 简介(思想) 粒子群优化算法&#xff08;Particle Swarm Optimization&…

passive模式 tcp_FTP主动模式和被动模式的比较

总是记不住FTP主动和被动模式的区别。放在这里&#xff0c;以备日后查阅。FTP是仅基于TCP的服务&#xff0c;不支持UDP。与众不同的是FTP使用2个端口&#xff0c;一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)。但FTP工作方式…

Java 中 finally 与 return 的执行顺序详解

java方法是在栈幀中执行&#xff0c;栈幀是线程私有栈的单位&#xff0c;执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间&#xff0c;栈幀分为三个区域&#xff1a; 1 . 操作数栈&#xff0c;用来保存正在执行的表达式中的操作数&#xff0c;数据…

车辆工程用得到python吗_如今车辆工程真的不如以前了吗?

背景&#xff1a;合肥工业大学2015届毕业生&#xff0c;车辆工程专业&#xff0c;理科实验班&#xff0c;成绩排名专业10%以内&#xff0c;有推免研究生资格。 上面这些title虽然比不上985的&#xff0c;但在当年工大的各专业中&#xff0c;基本上是无敌的存在了。 然后当年我竟…

headfirstjava最新版本下载_读过HeadFirstJava的大神进来看看

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼线程一章有个聊天程序&#xff0c;我运行之后客户端没将服务器的内容显示在JTextArea中&#xff0c;求解答客户端程序import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import java.net.*;public…

python爬虫能秒杀么_面试题之用python爬取并夕夕不同时段秒杀商品信息

先上效果图吧&#xff08;因为确实也是刚入门&#xff0c;很多细节没有注意到的&#xff0c;各位尽管提出来&#xff09;并夕夕很多时候都在不停的有秒杀商品的活动&#xff0c;对于价格问题&#xff0c;我就没法讨论了&#xff0c;但是人家能吸引到这么多流量&#xff0c;真本…

Java throws和throw

throws 声明异常 当一个方法产生一个它不处理的异常时&#xff0c;那么就需要在该方法的头部声明这个异常&#xff0c;以便将该异常传递到方法的外部进行处理。使用 throws 声明的方法表示此方法不处理异常。throws 具体格式如下&#xff1a; returnType method_name(paramLi…

html 怎么让tr的css覆盖td的_通达OA上传漏洞之变量覆盖分析

作者&#xff1a;kw0ng开始通达OA上传到包含漏洞分析的文章已经有很多&#xff0c;本文重点分析&#xff0c;文件上传处决定路径信息是否回显的UPLOAD_MODE参数是怎么传递的。代码分析触发文件上传点位于/ispirit/im/upload.php中&#xff0c;服务端在接收文件信息的同时还需要…

怎么看电脑的hdmi是输出还是输入_高清hdmi矩阵切换器4进4出音视频方案介绍景阳华泰科技...

高清hdmi矩阵切换器4进4出多少钱&#xff1f;这就需要了解您需要哪种4进4出矩阵&#xff01;景阳华泰科技生产的矩阵分为两种形式&#xff0c;一种是我们近几十年来一直使用的一体机&#xff0c;高清HDMI矩阵切换器4进4出采用一体机结构&#xff0c;经济实惠&#xff0c;功能较…

专业音频如何把电平转换成dbu_谭俊峰|录课、买麦,你应该了解的音频常识

近来&#xff0c;有打算录录课、吹吹牛&#xff0c;于是想升级一下硬件。既然要录音&#xff0c;那搞个好一点儿的麦克风总是必要的。于是&#xff0c;上网去查。不查不知道&#xff0c;一查吓一跳。为啥呢&#xff1f;既不为产品的琳琅满目&#xff0c;也不为价格的云泥之别&a…

android 自定义进度条_第一百八十九回:Android中自定义ProgressBar三

各位看官们大家好&#xff0c;上一回中咱们说的是Android中自定义ProgressBar的例子&#xff0c;这一回咱们继续说该例子。闲话休提&#xff0c;言归正转。让我们一起Talk Android吧&#xff01;看官们&#xff0c;我们在上一回是通过自定义PrgressBar的方式给它添加了文字&…

Java信息验证

某仓库管理系统的登录界面中需要输入用户名和密码&#xff0c;其中用户名只能由 6~10 位数字组成&#xff0c;密码只能有 6 位&#xff0c;任何不符合用户名或者密码要求的情况都视为异常&#xff0c;并且需要捕获并处理该异常。 下面使用自定义异常类来完成对用户登录信息的验…

沉降观测曲线图 沉降观测汇总_这些沉降观测要求,工程人必须掌握!

1沉降观测的基本要求 1)仪器设备、人员素质的要求根据沉降观测精度要求高的特点&#xff0c;为能精确地反映出建(构)筑物在不断加荷下的沉降情况&#xff0c;一般规定测量的误差应小于变形值的1/10—1/20&#xff0c;为此要求沉降观测应使用精密水准仪(S1或S05级)&#xff0c;水…

rgb红色范围_【论文阅读18】RGB-D Object-Oriented Semantic Mapping

主要内容基于RGB-D数据的语义建图&#xff08;SLAM帮助语义&#xff09;。具体过程如下首先利用SSD执行单帧RGB图片&#xff08;2D&#xff09;物体检测。接着基于检测结果和深度信息&#xff0c;利用3D分割算法进一步分割3D点云。最终利用ORB-SLAM2的相机位姿信息将每帧的3D点…

Java的异常跟踪栈

异常对象的 printStackTrace() 方法用于打印异常的跟踪栈信息&#xff0c;根据 printStackTrace() 方法的输出结果&#xff0c;开发者可以找到异常的源头&#xff0c;并跟踪到异常一路触发的过程。 看下面用于测试 printStackTrace 的例子程序。 class SelfException extends…

7价 半导体掺杂_掺杂工艺(一)

概述半导体材料的独特性质之一是它们的导电性和导电类型(N型或P型)能被产生和控制。在本章中&#xff0c;描述在晶圆内和表面上特别的小块导电区和PN结的形成。介绍扩散和离子注入两种掺杂技术的原理和工艺。简介使晶体管和二极管工作的结构就是PN结。结(junction)就是富含电子…

数据增强_imgaug图像数据增强必备工具

导读我们经常会遇到训练模型时数据不够的情况&#xff0c;而且很多时候无法再收集到更多的数据&#xff0c;只能通过做一些数据增强或者其它的方法来合成一些数据。常用的数据增强方式有裁剪、旋转、缩放、亮度对比度色度饱和度变换、仿射变换、透视变换等&#xff0c;这篇文章…

Java类的封装

封装将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;只能通过该类提供的方法来实现对隐藏信息的操作和访问。 封装的特点&#xff1a; 只能通过规定的方法访问数据。隐藏类的实例细节&#xff0c;方便修改和实现。实现封装的具体步骤如下&#xff…

python 公众号菜单_Python脚本--微信公众号自定义菜单的创建及获取

#-*- coding: utf-8 -* importtkMessageBoximporturllib2importjsonimportsys reload(sys) sys.setdefaultencoding(UTF-8) appID wxa46e26b3d591f9f2 //测试号信息 appsecret 83ee70dbb6dbc1e090971554b1c7981b //同上 menu { //菜单信息&#xff0c;包括一级菜单和二级菜单&q…