Java基础【异常】

异常是什么

异常是指程序执行过程中可能出现的错误或意外情况。

异常有哪些种类

编译异常

Checked Exception:这类异常在代码编译期间就被检测出来,必须显式地进行处理,否则编译不通过。常见的Checked Exception包括IOException、SQLException等。

编译时异常是指在编译阶段可能会出现的异常,这些异常需要在代码中进行明确的处理,否则无法通过编译。例如,FileNotFoundException(文件未找到)、IOException(输入输出异常)等都是编译时异常的例子。编译时异常通常是由于外部资源操作或者错误的输入导致的,因此编译器要求程序员在代码中显式地进行异常处理,以保证程序的健壮性。

运行异常

Unchecked Exception:也称为RuntimeException及其子类异常,这类异常通常是由程序员编码不规范或逻辑错误导致的,编译器在编译期间不做强制性检查,因此也不需要强制进行异常处理。常见的Unchecked Exception包括NullPointerException、IndexOutOfBoundsException等。

运行时异常是指在程序运行过程中可能会出现的异常,这些异常通常是由程序逻辑错误导致的,如空指针引用、数组下标越界等。与编译时异常不同,对于运行时异常,编译器不要求程序员进行强制的异常处理

Throwable(可抛出):是所有异常的根类,它有两个直接子类:Error和Exception。

Error:表示严重的问题,一般是由虚拟机报告的,程序无法处理。例如,OutOfMemoryError、StackOverflowError等。
Exception:表示程序运行中可能出现的异常情况,分为两种类型:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。

RuntimeException:是Unchecked Exception的父类,继承自Exception类

  • Checked
    Exception:必须显式处理的异常,继承自Exception类但不是RuntimeException类的异常。例如,IOException、SQLException等。
  • Unchecked
    Exception:编译器不要求显式处理的异常,继承自RuntimeException类的异常。例如,NullPointerException、IndexOutOfBoundsException等。
  • ClassNoteFoundExcepton异常:
  • FileNotFoundException异常:

异常如何处理

编译异常处理注意事项

异常处理的方式:编译时异常通常需要使用try-catch块来捕获和处理。在可能抛出异常的代码块周围使用try块,并在catch块中处理异常情况。

抛出异常: 如果当前方法不适合处理异常,也可以选择在方法签名中声明抛出异常,使用throws关键字将异常传播给调用方。

资源关闭: 在处理文件IO、网络连接等资源时,需要确保资源在使用完毕后被正确关闭。通常使用try-with-resources语句(Java 7及以上版本)来自动关闭资源,以避免资源泄漏。

异常信息记录:在捕获异常时,应该记录异常信息,包括异常类型、发生的位置、以及可能的原因。这有助于排查和修复问题。

适当的异常处理策略:根据具体的业务需求和程序逻辑,为编译时异常选择适当的处理策略,可能是重试操作、回滚数据、提供默认值等。

易读性和可维护性:良好的异常处理代码应当易于阅读和理解,同时保持代码的可维护性。避免过度捕获异常或者不恰当地隐藏异常信息。

运行异常处理注意事项

异常捕获与处理:虽然对于运行时异常并不要求强制进行异常处理,但良好的编程实践通常会包括对运行时异常的捕获和处理。通过try-catch块来捕获运行时异常,可以避免程序意外终止。

异常日志记录:在捕获运行时异常时,建议记录异常信息到日志文件中,包括异常堆栈轨迹、发生的时间等,以便后续排查问题。

异常处理策略:根据具体业务需求和程序逻辑,为运行时异常选择适当的处理策略。可能是向用户显示友好的错误信息、进行数据回滚操作或者执行紧急处理逻辑等。

避免过度捕获:避免过度捕获运行时异常,尤其是使用catch(Exception e)这样的泛化异常捕获方式。应该尽量精确捕获需要处理的异常类型,以避免隐藏潜在问题。

异常处理链:在捕获和处理运行时异常时,可以构建异常处理链,将异常传递给调用方处理或者上层调用栈进行处理,以便更灵活地处理异常情况。

协作与通知:在捕获运行时异常后,需要考虑如何通知相关的模块或功能,以便进行协作和进一步处理。

异常的应用

错误处理:异常是用来处理程序执行过程中可能出现的错误情况的一种机制。通过抛出和捕获异常,可以有效地处理各种异常情况,如空指针异常、数组越界异常等,从而提高程序的健壮性和可靠性。

异常传递:在方法调用链中,如果某个方法无法处理异常情况,可以选择将异常传递给调用方处理,直到找到合适的异常处理位置。这种异常传递机制帮助实现模块之间的协作与通信。

事务管理:在数据库操作或其他涉及事务处理的场景中,异常常常被用来进行事务回滚操作。当发生异常时,可以捕获异常并执行事务回滚,以确保数据的一致性和完整性。

资源管理:在需要释放资源(如文件、网络连接、数据库连接等)的情况下,异常处理可以确保资源得到正确释放,避免资源泄露问题。

自定义异常:除了Java提供的标准异常类外,程序员还可以根据实际需求定义自己的异常类,用于特定场景下的异常处理。通过自定义异常可以更准确地描述异常情况,并提供更详细的异常信息。

自定义异常

// 自定义异常类
class MyCustomException extends Exception {public MyCustomException(String message) {super(message);}
}// 使用自定义异常的示例
class CustomExceptionExample {public static void main(String[] args) {try {int age = -1; // 假设这里是从用户输入或其他来源获取的年龄if (age < 0) {throw new MyCustomException("年龄不能为负数");}System.out.println("年龄为:" + age);} catch (MyCustomException e) {System.err.println("发生自定义异常:" + e.getMessage());// 这里可以进行进一步的异常处理,比如记录日志、通知相关模块等}}
}

首先定义了一个自定义异常类MyCustomException,它继承自Exception类。在自定义异常类中,我们可以编写自己的构造函数和其他方法,以满足特定的异常处理需求。

然后,在CustomExceptionExample类的main方法中,我们模拟了一个场景:当从外部获取到年龄值为负数时,抛出自定义异常MyCustomException。在catch块中捕获并处理了这个自定义异常,打印了异常信息,并进行了简单的异常处理操作。

throw 和 throws的区别是什么

throws:
throws关键字用于在方法声明中指定可能会抛出的异常类型,表示该方法可能会抛出某些异常,并由调用方处理这些异常。
当一个方法中可能会引发异常,但不想在方法内部处理异常时,可以使用throws关键字将异常向上一层调用栈传递,直到有地方捕获并处理这些异常。
一个方法可以声明多个异常类型,用逗号分隔,如void myMethod() throws IOException, SQLException { … }。

throw:
throw关键字用于在程序中手动抛出一个异常对象。即在代码中人为地创建一个异常对象,并将其抛出,从而触发异常处理机制。
通常在代码执行过程中遇到特定情况需要抛出异常时使用throw关键字,比如参数校验失败、业务逻辑错误等。
throw后面通常跟着一个异常对象,如throw new IOException(“File not found”);。

总结:
throws用于方法声明中,表示可能会抛出的异常类型,由调用方处理。
throw用于实际代码中,手动抛出异常对象。

// 使用throws关键字声明可能会抛出异常
void myMethod() throws IOException {// 方法内部可能会抛出IOException
}// 使用throw关键字手动抛出异常
void checkAge(int age) {if (age < 0) {throw new IllegalArgumentException("年龄不能为负数");}
}

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

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

相关文章

Chain of Note-CoN增强检索增强型语言模型的鲁棒性

Enhancing Robustness in Retrieval-Augmented Language Models 检索增强型语言模型&#xff08;RALMs&#xff09;在大型语言模型的能力上取得了重大进步&#xff0c;特别是在利用外部知识源减少事实性幻觉方面。然而&#xff0c;检索到的信息的可靠性并不总是有保证的。检索…

[ESP32]:基于HTTP实现百度AI识图

[ESP32]&#xff1a;基于HTTP实现百度AI识图 测试环境&#xff1a; esp32-s3esp idf 5.1 首先&#xff0c;先配置sdk&#xff0c;可以写入到sdkconfig.defaults CONFIG_IDF_TARGET"esp32s3" CONFIG_IDF_TARGET_ESP32S3yCONFIG_PARTITION_TABLE_CUSTOMy CONFIG_PA…

深度解析大模型的关键特性与优势

大模型通常指的是具有极其庞大参数规模、先进架构和广泛适用性的机器学习模型。这类模型因其前所未有的规模和强大的通用性而备受关注&#xff0c;下面是大模型的一些显著特点&#xff1a; 大规模参数量&#xff1a; 大模型的核心特征之一就是其庞大的参数规模&#xff0c;动辄…

值迭代和策略迭代【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 文章目录 强化学习笔记一、Value It…

江苏开放大学2024年春《中级会计实务(上) 050284》第1次任务第一单元总论、第二单元存货练习参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库&#xff…

Qt教程 — 3.6 深入了解Qt 控件:Display Widgets部件(2)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QTextBrowser组件-简单的文本浏览器 ​2.2 QGraphicsView组件-简单的图像浏览器 Display Widgets将分为两篇文章介绍 文章1&#xff08;Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件-CSDN…

Magic Copy:一键AI抠图,在浏览器中获得任何图像素材

Magic Copy&#xff1a;轻松一点&#xff0c;精准抠图&#xff0c;让创意无限放大&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 Magic Copy&#xff08;AI智能抠图插件&#xff09;是一个创新型的浏览器扩展工具&#xff0c;其独特之处在于能够无缝集成于用户的网…

CCDP.02.OS正确部署后的Dashboard摘图说明

前言 在部署成功OpenStack后&#xff0c;应该可以在浏览器打开Dashboard&#xff0c;并对计算资源&#xff08;这里主要是指VM&#xff09;进行管理&#xff0c;也可以在Dashboard上面查看OpenStack是否存在错误&#xff0c;下面&#xff0c;已针对检查的关键点&#xff0c;用红…

两个包装类型变量的比较问题

问题&#xff1a; 由于受包装类的自动装箱和拆箱的影响&#xff0c;一直以为直接用直接比较两个包装类的大小是否相等就可以&#xff0c;惭愧。比如&#xff1a; Integer a11; Integer b11; System.out.println(ab); 运行结果是 true&#xff0c;似乎没啥问题&#xff0c;但…

Mysql之索引存储原理

在介绍索引实现之前&#xff0c;我们先来了解下几种树的数据结构&#xff1a; 一、二叉搜索树 二叉搜索树有以下性质&#xff1a; 1.每个节点有一个关键字 2.左右孩子至多有一个。 3.关键字大于左孩子&#xff0c;小于右孩子。 正因为二叉搜索树的特性&#xff0c;所以这种数…

基于java+springboot+vue实现的游戏账号估价交易平台(文末源码+Lw+ppt)23-555

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对游戏账号估价交易的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自…

计算机网络拓扑结构

目录 <网络拓扑结构概念> <典型的拓扑结构介绍> 第一种&#xff0c;总线型网络拓扑结构 第二种&#xff0c;星型网络拓扑结构 第三种&#xff0c;树型网络拓扑结构 第四种&#xff0c;环型网络拓扑结构 第五种&#xff0c;网状型网络拓扑结构 第六种&#…

Structured Knowledge Distillation for Accurate and Efficient Object Detection

摘要 许多之前的知识蒸馏方法是为图像分类而设计的&#xff0c;在具有挑战性的任务&#xff08;如目标检测&#xff09;中失败。本文首先提出了知识蒸馏在目标检测中失败的主要原因是&#xff1a;&#xff08;1&#xff09;前景和背景之间不平衡&#xff1a;(2)缺乏对不同像素…

【vim 学习系列文章 16 -- vim 自动保存设置】

文章目录 vim 自动保存设置 vim 自动保存设置 在 Vim 编辑器中&#xff0c;你可以通过设置 updatetime 选项来控制自动保存的时间间隔。updatetime 的默认值是 4000 毫秒&#xff08;4 秒&#xff09;&#xff0c;但你可以将其设置为 5000 毫秒&#xff08;5 秒&#xff09;以…

PTA L2-027 名人堂与代金券

对于在中国大学MOOC&#xff08;http://www.icourse163.org/ &#xff09;学习“数据结构”课程的学生&#xff0c;想要获得一张合格证书&#xff0c;总评成绩必须达到 60 分及以上&#xff0c;并且有另加福利&#xff1a;总评分在 [G, 100] 区间内者&#xff0c;可以得到 50 元…

公司内部局域网怎么适用飞书?

随着数字化办公的普及&#xff0c;企业对于内部沟通和文件传输的需求日益增长。飞书作为一款集成了即时通讯、云文档、日程管理、视频会议等多种功能的智能协作平台&#xff0c;已经成为许多企业提高工作效率的首选工具。本文将详细介绍如何在公司内部局域网中应用飞书&#xf…

【机器学习之---统计】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派&#xff08;传统学派&#xff09;认为样本信息来自总体&#xff0c;通过对样本信息的研究可以合理地推断和估计总体信息…

java中Arrays介绍及常用方法

在Java中&#xff0c;java.util.Arrays类是一个提供了各种操作数组的工具类。该类提供了一系列静态方法来对数组进行排序、搜索、填充、复制等操作。下面是对Arrays类的介绍以及常用方法的说明: toString()方法&#xff1a;将数组转换为字符串形式并返回&#xff0c;方便输出数…

MySQL GROUP BY 语句的作用,对比不用group by 的方法效果

内容介绍 合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。 GROUP BY 语句 GROUP BY 语句用于结合合计函数&#xff0c;根据一个或多个列对结果集进行分组。 SQL GROUP BY 语法 SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name …

docker 的八大技术架构(图解)

docker 的八大技术架构 单机架构 概念&#xff1a; 应用服务和数据库服务公用一台服务器 出现背景&#xff1a; 出现在互联网早期&#xff0c;访问量比较小&#xff0c;单机足以满足需求 架构优缺点&#xff1a; 优点&#xff1a;部署简单&#xff0c;成本低 缺点&#xff1…