Java 异常(Exceptions)

news2025/1/20 22:02:49

目录

1、什么是异常?

2、捕获并处理异常

try-with-resources 语句

3、通过方法抛出异常

自定义异常


1、什么是异常?

        定义:异常是在程序执行过程中发生的一种事件,它会中断程序指令的正常流程。

        当方法中发生错误时,该方法会创建一个对象并将其移交给运行时系统。该对象称为异常对象,包含有关错误的一些信息,比如错误的类型和错误发生时程序的状态等。创建异常对象并将其交给运行时系统的行为称为抛出异常

        方法抛出异常后,运行时系统会尝试寻找处理异常的方法。这些处理异常的方法可能是一个有序的方法集合,通过调用这些方法来获取错误抛出的位置。方法调用堆栈如下:

        运行时系统会在调用堆栈中搜索可以处理该异常的方法(代码块),该代码块称为异常处理程序。搜索从发生错误的方法开始,然后按照与调用方法的相反顺序遍历调用堆栈,如果找到了适当的处理程序,运行时系统会将异常传递给处理程序。如果程序没有找到能处理该异常的代码块,那么程序将终止运行

        Java 有三种类型的异常:编译时异常、运行时异常、错误(Error)。

        在 Java 中处理异常的两种方式:

  1. 使用捕获异常的 try 语句// try...catch...finally
  2. 指定一个方法可以抛出的异常。该方法必须提供一个throws子句来列出异常。

2、捕获并处理异常

try-with-resources 语句

        在关闭文件或以其他方式恢复资源时,推荐使用 try-with-resources 语句而不是finally块。try-with-resources 语句在不再需要系统资源时会自动释放系统资源。// 关闭或者恢复资源

public void writeList() throws IOException {
    try (FileWriter f = new FileWriter("OutFile.txt");
         PrintWriter out = new PrintWriter(f)) {
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    }
}

        try-with-resources 语句是一个 try 语句,在该语句中可以声明一个或多个资源。资源是程序使用完后必须关闭的对象。try-with-resources 语句可以确保在语句末尾关闭每个资源。任何实现了java.lang.AutoCloseable 或 java.io.Closeable 接口的对象,都可作为 try-with-resources 的资源使用。

        注意:try-with-resources 语句可以像普通的 try 语句一样有 catch 和 finally 块。catch 或 finally 语句块会在声明的资源被关闭后运行。

不使用 try-with-resources 语句关闭资源带来的资源泄露问题

        在 Java SE 7之前,可以使用 finally 块来关闭资源。下面的例子使用 finally 块代替 try-with-resources 语句:

static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {

    FileReader fr = new FileReader(path);
    BufferedReader br = new BufferedReader(fr);
    try {
        return br.readLine();
    } finally {
        br.close(); // 此关闭方式存在资源泄露问题
        fr.close();
    }
}

        但是,上例可能存在资源泄漏问题。上边程序在完成资源使用后,除了依赖垃圾收集器(GC)回收内存资源外,还需要通过调用资源的 close 方法,将资源释放回给操作系统。但是,如果程序在GC回收资源之前没有释放资源,那么释放资源所需的信息就会丢失。该资源仍被认为操作系统正在使用,所以会出现资源泄漏的问题。

        在本例中,如果 readLine 方法抛出异常,并且 finally 块中的 br.close() 语句抛出异常,那么FileReader已经泄漏。因此,推荐使用 try-with-resources 语句而不是 finally 块来关闭程序的资源。

3、通过方法抛出异常

        在一些情况下,异常发生时,通过代码捕获异常是合适的。然而,在一些情况下,让调用堆栈上的方法去处理异常可能更加合适。例如,异常发生时,你无法预测到所有用户的需求。那么在这种情况下,就最好不捕获异常,并允许调用堆栈上的方法去处理它。// 直接抛出异常

        Throwable Class 和它的子类:

        Error Class:当 Java 虚拟机中发生动态链接故障或其他故障时,虚拟机抛出一个 Error。简单的程序通常不会捕获或抛出 Error。

        Exception Class:大多数程序抛出和捕获派生自 Exception Class 的对象。Exception 表示发生了问题,但不是严重的系统问题。我们编写的大多数程序都会抛出和捕获 Exception,而不是 Error。

自定义异常

        继承 Exception,可以实现自定义异常。

        关于运行时异常(未检查异常):

        运行时异常可以发生在程序中的任何地方,典型的运行时异常可能非常多。如果必须在每个方法声明中添加运行时异常会降低程序的清晰度。因此,编译器不要求你捕获或指定运行时异常(尽管您可以)。

        一般来说,不要抛出 RuntimeException 或创建 RuntimeException 的子类,因为你不想为指定方法可以抛出的异常而烦恼。

        下面是底线准则:如果客户端可以合理地从异常中恢复,那么将其设置为检查异常。如果客户端无法从异常中恢复,则将其设置为未检查异常。

        // 异常是 Java 中比较简单的一部分,该处只对异常做了一些简单的记录,以上一些表述摘自一些官方的介绍,供日常学习和知识梳理。

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

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

相关文章

2022年我国止血药行业市场规模不断增长 激活凝血因子活性药是主流产品

根据观研报告网发布的《中国止血药市场现状深度研究与发展前景分析报告&#xff08;2022-2029年&#xff09;》显示&#xff0c;止血药主要是指凡能够制止体内外出血的药物&#xff0c;主要适用于各部位出血病症&#xff0c;如咯血、衄血、吐血、尿血、便血、崩漏、紫癜及创伤出…

记录一次使用 Ubuntu 编译 Wakaama 踩坑过程

1. 背景 公司项目需要使用 LwM2M 协议&#xff0c;由于是个相对冷门的小众协议&#xff0c;客户端模拟器几乎没有&#xff0c;只有 Eclipse Wakaama 相对来说功能齐全、易用&#xff0c;但是这个软件没有编译好的程序包&#xff0c;只能从 Github 拉取源码手动编译运行。 不知道…

操作系统期末知识点复习

操作系统知识点总结 参考用书&#xff1a;计算机操作系统&#xff08;第四版&#xff09;汤小丹等著 1、必考知识点 第一章 操作系统引论 操作系统的概念及特征操作系统的运行环境 第二章 进程的描述与控制 进程状态与转换同步与互斥的基本概念信号量信号量的基本应用生产者消…

Nacos的配置中心的了解

目录 1. 为何需要配置中心 2. nacos的配置中心 2.1 配置示例 2.2 多环境配置 2.3 GROUP 2.4 namespace 1. 为何需要配置中心 没有配置中心的情况下会出现什么情况&#xff1a; 如果没有配置中心&#xff0c;则各个服务的配置文件分散在各个项目中&#xff0c;不方便维护…

不用光盘重装系统如何操作

​光盘重装系统是之前十分常用的系统安装方法,随着科技的飞速发展,现如今重装系统的方法五花八门,一键重装系统以及U盘重装系统等方法的出现取代了光盘重装系统,这里就来介绍一下不用光盘重装系统操作方法。 工具/原料&#xff1a; 系统版本&#xff1a;windows10系统 品牌型…

Kotlin协程笔记:CoroutineScope管理协程

CoroutineScope 是实现协程结构化并发的关键。使用 CoroutineScope&#xff0c;可以批量管理同一个作用域下面所有的协程。 CoroutineScope 与 结构化并发 launch、async 被定义成了 CoroutineScope 扩展函数。在调用 launch 之前&#xff0c;必须先获取 CoroutineScope。 pub…

高级又高效的属性表编辑技术,你值得拥有!

当你要按关键词选择内容,无从下手? 当你要修改字段的部分内容,不知所措? 当你要提取出字段的某些内容,毫无头绪? 当你要按照位数来提取字符内容,力不从心? 当你要为字段补充一些新的内容,目瞪口呆? 当你要把一个字段分割成多个字段,抓耳挠腮? ...... 属性表的…

CUDA ~ WarpReduce

又是一篇关于cuda的 要好好学学哦, CUDA 编程进阶分享&#xff0c;一些 warp 的使用 如何实现一个高效的Softmax CUDA kernel&#xff1f;多少还是有些细节没有理解&#xff0c;恰好最近要做一个类似的 ReduceScale Kernel&#xff0c;原理机制还是比较相似的&#xff0c;所以…

CSS -- 10. 移动WEB开发之rem布局

文章目录移动WEB开发之rem布局1 rem基础2 媒体查询2.1 什么是媒体查询2.2 语法规范2.3 mediatype 查询类型2.4 关键字2.5 媒体特性2.6 案例&#xff1a;根据页面宽度改变背景颜色2.7 媒体查询rem实现元素动态大小变化2.8 针对不同的屏幕尺寸引入不同的样式文件3 Less基础3.1 维…

8000字详解Thread Pool Executor

摘要&#xff1a;Java是如何实现和管理线程池的?本文分享自华为云社区《JUC线程池: ThreadPoolExecutor详解》&#xff0c;作者&#xff1a;龙哥手记 。 带着大厂的面试问题去理解 提示 请带着这些问题继续后文&#xff0c;会很大程度上帮助你更好的理解相关知识点。pdai …

数据泄露成数据安全最大风险,企业如何预防呢?

据《中国政企机构数据安全风险分析报告》显示&#xff0c;2022年1月——2022年10月&#xff0c;安全内参共收录全球政企机构重大数据安全报道180起&#xff0c;其中数据泄露相关安全事件高达93起&#xff0c;占51.7%。与近三年平均每月公开报道频次相比&#xff0c;2022年相较前…

如何在3DMAX中不使用Maxscript或插件破碎物体对象?

在3DMAX中破碎物体我们通常会借助Maxscript或者插件&#xff0c;其实&#xff0c;不借助任何其他工具&#xff0c;3DMAX也可以实现对物体的破碎&#xff0c;下面就给大家介绍一种方法&#xff1a; 1.首先&#xff0c;创建一个破碎对象&#xff0c;比如一个石块&#xff08;或者…

AI趋势下,小布助手的进化论

“要构建人工智能等高精尖产业的新增长引擎”&#xff0c;随着人工智能在未来全球科技经济中的重要作用愈加凸显&#xff0c;当前产业已然获得了有史以来最强的政策建构力量。 随着政策的利好&#xff0c;中国人工智能进入一个前所未有的快速发展阶段。企查查数据显示&#xf…

疫情下的在线教学数据观

由于新型冠状病毒感染的肺炎疫情影响&#xff0c;剧烈增长的市场需求助推了在线教育的发展&#xff0c;同时也暴露了一些问题。 最近我们被客户要求撰写关于疫情的研究报告&#xff0c;包括一些图形和统计输出。 在本文中&#xff0c;我们结合了对100多个高中学生进行的在线教…

快讯 | 嘉为蓝鲸受邀出席汽车新智造数字行业峰会,助力构建数字时代竞争力!

12月9日&#xff0c;第五届GADI汽车新智造数字创新行业峰会暨年度评选盛典于上海圆满落幕&#xff0c;嘉为蓝鲸受邀出席。本届大会以“数智创新 赋能破局”为主题&#xff0c;多方面切入解读新能源汽车的数字化发展趋势&#xff0c;助力车企构建数字时代竞争力。 01 研运一体&a…

数据通信基础 - 信道特性(奈奎斯特定理、香农定理 )

文章目录1 概述1.1 通信系统模型图2 信道特性2.1 信道带宽 W2.2 奈奎斯特定理 - 无噪音2.3 香农定理 - 有噪音2.4 带宽、码元速率、数据速率 关系梳理3 网工软考真题1 概述 1.1 通信系统模型图 通信的目的&#xff1a;传递信息 2 信道特性 2.1 信道带宽 W 模拟信道&#…

数据中台选型必读(六):说说数据服务的七大核心功能

在前面的文章中&#xff0c;我们介绍了数据中台的元数据中心、指标字典与指标体系、数据模型设计、数据质量评估等内容&#xff0c;这些都是One Data理念下数据中台架构的重要部分。 我们今天要讲的One Service——统一数据服务&#xff0c;指的是由数据中台提供统一的数据接入…

搭建自动发卡网站搭建教程(独角数卡)保姆级教程,支付 + 图文

自动发卡网站 程序是开源的独角数卡 我搭建了一个这样的 wooknow自动销售发卡http://ok.54ndd.com/ 一个在线销售虚拟产品的平台。你应该见过这样的发卡平台。一些虚拟产品&#xff0c;如软件、激活码和会员可以放在上面出售。我在这里使用的发卡项目是一个开源的单字符数字…

Matplotlib怎么创建 axes 对象?

在 matplotlib 中&#xff0c;有几种常见的方法来创建 axes 对象&#xff1a; 1.使用 subplots 函数&#xff1a; import matplotlib.pyplot as pltfig, ax plt.subplots()subplots 函数会创建一个新的图形&#xff08;figure&#xff09;并返回一个包含单个子区域&#xff…

二肽Ala-Pro,13485-59-1

Substrate for skin fibroblast prolidase.皮肤成纤维细胞prolida酶的底物。 编号: 199181中文名称: 二肽Ala-Pro英文名: Ala-ProCAS号: 13485-59-1单字母: H2N-AP-OH三字母: H2N-Ala-Pro-COOH氨基酸个数: 2分子式: C8H14N2O3平均分子量: 186.21精确分子量: 186.1等电点(PI): 6…