【JavaSE】浅谈Java异常

news2024/11/18 9:07:11

前言

本篇文章是对Java异常体系相关内容及部分注意事项的的讲解。

一. 认识异常

在每个人的生命历程中,或多或少都会遇到生病或受伤的情况,比如:皮肤擦伤、感冒、发烧、患上某些传染病等等。不管“病情”严重与否,这些都可以算作人体出现的“异常”。

在Java中,一个程序执行过程中发生的不正常行为就称为异常

在Java的异常体系中,可以分为 Exception(异常) 和 Error(错误)两大类, 它们都继承自 Throwable 这个顶级父类,而 Exception 又可以分为 Checked Exception(受查异常) 和 Unchecked Exception(非受查异常)两大类,每一类异常又划分出各类详细的异常。(如下图)
在这里插入图片描述

在上图异常体系中:

  • Error 指的是 JVM 无法解决的严重问题,它通常由环境问题或严重的系统错误引起。这种错误通常不建议进行捕获
  • Exception 指的是程序本身可以处理的异常,通常可以使用 try-catch 的方式对异常进行捕获,并在发生时针对具体的异常做出不同的处理。
  • 其中Exception 的子类 Checked Exception(受查异常,也称作编译时异常)必须在编译期间进行处理(try-catch 或 将异常作为声明抛出);Unchecked Exception (非受查异常,也称作运行时异常)通过在程序运行期间才会被发现,因此则无需进行显式处理,在异常真正发生时会交给 JVM 处理。(如下图)

在这里插入图片描述

在这里插入图片描述


二. 异常的处理

1. 异常处理的两种思维方式

首先,我们必要要清楚一个事实:对于编程初学者或经验不足的编程人员来说,写出有 BUG(异常)的程序是一个正常的现象,我们不能因此害怕异常,而应该在每次异常出现时了解异常出现在代码层面的根本原因,学习与积累解决异常的方法。这样长久以往,我们终能写出一个 BUG 很少的程序。(甚至没有 BUG。当然了,这只是对自己的激励,现实情况中再牛的程序也会出现 BUG)

咳咳,回到正文。

对于不可预期的异常,通常有两种解决的思维方式:(1)“防御式” 编程(2)“事后认错型”编程。

  • “防御式”编程:在一个完整的事件流程中,针对每一步骤的执行结果进行检查,若其中某个步骤的执行结果出现错误则立即终止执行流程,以免后续得到不可预期的错误结果。(如下图)
    在这里插入图片描述
    从上图可以发现:“防御式”编程会严格检查每一步的执行结果,确保错误在第一时间被发现并处理。但上述伪代码的执行流程存在一个明显的问题:正常的执行流程和错误处理流程混合在一起,导致代码的简洁性和可读性比较差

  • “事后认错型”编程:让可能出现异常的流程先执行,等到异常真正出现再统一对异常进行处理。(推荐!)
    在这里插入图片描述
    从上图不难发现:正常流程和错误处理流程分开,可以让程序员清晰直观地了解执行流程,增强代码的可读性。

2. 处理异常

在Java中,对异常的处理主要涉及到 5 个关键字:throwthrowstrycatchfinally

  1. throw:该关键字用于在代码中主动抛出一个指定的异常。这个异常需要是 Throwable 类或其子类的实例。它的作用是在程序出现错误时,将对应的错误信息通知给调用者。

它的使用示例如下:

	// 该方法的作用:为数组指定下标设置 val
	public boolean setElement(int[] nums, int val, int index) {
	    if (nums == null) {
	        throw new NullPointerException();
	    }
	
	    if (index < 0 || index >= nums.length) {
	        throw new IndexOutOfBoundsException();
	    }
	
	    nums[index] = val;
	    return true;
	}
  1. throws:该关键字用于方法声明时提示该方法可能会抛出的异常类型。调用方必须对这些可能抛出的异常进行处理,若调用方不想对异常做出处理,依然可以使用 throws 关键字抛出这些异常,将异常处理交给上一层的调用者, throws 最多能将处理权传递到 main()方法,即交给 JVM 处理。

它的使用示例如下:

	public static void readFile() throws IOException{
	    // 对一个文件的内容进行读取
	}
	
	public static void databaseOption() throws SQLException {
	    // 查询或修改数据库数据
	}

注意:
throws用于声明可能抛出的受查异常。因为对于非受查异常来说,只有在程序运行期间才会被发现,因此即使一个自定义方法在方法签名中声明了非受查异常,方法的调用方也不需要对该异常进行显式处理

  1. try:该关键字用于定义一个代码块,其中包含可能抛出异常的语句。try 关键字用于处理受查异常时不能单独使用,后面通常需要跟着多个 catch 块或一个 finally 块。(catch 和 finally 至少需要一个,也可以同时使用)
  2. catch:该关键字定义的代码块用于处理捕获到的异常。
  3. finally:无论 try代码块 中是否抛出异常,finally 关键字定义的代码块最终都会执行,它主要用于释放被打开的资源,防止发生异常时后续关闭资源的语句不能被及时调用,从而造成系统资源泄露的问题。例如: IO读写流、数据库连接等。

它的使用示例如下:

    public static void main(String[] args) {

        try {
            readFile();
            databaseOption();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 进行收尾工作及释放已打开的资源
        }

    }


    public static void readFile() throws IOException {
        // 对一个文件的内容进行读取
    }

    public static void databaseOption() throws SQLException {
        // 查询或修改数据库数据
    }

运行结果如下:

注意:finally中的代码块不一定会执行。这与上面 finally 关键字的说明并不冲突,比如以下三种特殊情况:
(1)在 finally 代码块执行前,Java虚拟机被提前终止运行(如下图)(2)程序所在的线程死亡(3)CPU被关闭

在这里插入图片描述


三. 使用 try-resource-with 代替 try-catch-finally

try-resource-with 是 Java7 引入的一种异常处理机制,用于自动关闭资源。它的使用初心与 try-catch-finally 一致,都是为了在程序发生异常时及时关闭已打开的资源,但使用 try-resource-with可以使写出的代码更加简洁清晰,并且能够有效减少因忘记关闭资源导致的系统资源泄露问题。

try-resource-with 的适用范围(资源的定义):任何实现 java.lang.AutoCloseablejava.io.Closeable 的对象。
try-resource-with 的执行顺序:无论是否发生异常,都会在 try 代码块执行结束后自动调用关闭资源的操作。

它的使用示例如下:

	public static void main(String[] args) {
		// 使用 try 将要打开的资源用括号“包裹”起来
        try (FileReader reader = new FileReader("test.txt")) {
            // 执行文件读写操作
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

注意:try 关键字后的括号可以包含多个需要使用的资源,它们之间使用 ; 进行分隔。(如下)

	public static void main(String[] args) {
        try (FileReader reader = new FileReader("test.txt");
            FileWriter writer = new FileWriter("text2.txt")) {
            // 执行文件读写操作
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

以上就是本篇文章的全部内容了,如果这篇文章对你有些许帮助,你的点赞、收藏和评论就是对我最大的支持。
另外,文章可能存在许多不足之处,也希望你可以给我一点小小的建议,我会努力检查并改进。

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

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

相关文章

java学习笔记1

1 初识java 1.1 jdk安装 1.1.1 下载jdk https://www.oracle.com/java/technologies/downloads/#java8-windows1.1.2 安装jdk jdk-8u361-windows-x64.exe安装到D:\Program Files\Java\jdk1.8.0_361安装jre,修改地址到D:\Program Files\Java\jre1.8.0_361jdk安装成功1.1.3 配置…

常见的七种排序

目录 一、插入排序 1、直接插入排序 2、希尔排序&#xff08;缩小增量排序&#xff09; 二、选择排序 3、直接选择排序 4、堆排序 三、交换排序 5、冒泡排序 6、快速排序 四、归并排序 7、归并排序 五、总结 一、插入排序 1、直接插入排序 思路&#xff1a; i 用来…

Python革命:如何利用AI数据分析引领人工智能的未来

在人工智能迅速发展的今天&#xff0c;Python语言已经成为了推动AI领域发展的一大利器。作为一种高级编程语言&#xff0c;Python以其简洁的语法和强大的功能&#xff0c;为AI数据分析提供了强有力的支持&#xff0c;帮助开启了人工智能的新时代。 Python的核心优势 Python的最…

NLP_知识图谱_三元组实战

文章目录 三元组含义如何构建知识图谱模型的整体结构基于transformers框架的三元组抽取baselinehow to use预训练模型下载地址训练数据下载地址 结构图代码及数据bertconfig.jsonvocab.txt datadev.jsonschemas.jsontrain.jsonvocab.json 与bert跟data同个目录model.pytrain.py…

Java——继承方式

在现实生活中&#xff0c;事物之间的关系是非常复杂&#xff0c;灵活多样&#xff0c;比如&#xff1a; 但在Java中只支持以下几种继承方式&#xff1a; 注意&#xff1a;Java中不支持多继承。 时刻牢记&#xff0c;我们写的类是现实事物的抽象。而我们真正在公司中所遇到的…

基于SpringBoot+Vue的外卖点餐网站 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;12张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue html 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&…

MATLAB设置变量

您可以通过简单的方式分配变量。例如&#xff0c; 示例 x 3 %定义x并用值初始化它 MATLAB将执行上述语句并返回以下结果- x 3 它创建一个名为x的1乘1矩阵&#xff0c;并将值3存储在其元素中。再举一个实例&#xff0c; 示例 x sqrt(16) %定义x并用表达式初始化它 MATLAB将…

Arduino UNO驱动MPR121接近电容式触摸传感器控制WS2812彩灯

简介 MPR121芯片功能强大可用作触摸,电容检测,驱动LED等等.在低速扫描下可以将功 耗降低到8μA,可以处理多达12个独立的触摸板。支持I2C,几乎可以用任何微控 制器连接。可以使用ADDR引脚选择4个地址中的一个,一个I2C2线总线上共有48 个电容触摸板。使用该芯片比使用模拟输入进行…

Tcpdump -r 解析pcap文件

当我们使用命令抓包后&#xff0c;想在命令行直接读取筛选怎么办&#xff1f;-r参数就支持了这个 当你使用 tcpdump 的 -r 选项读取一个之前捕获的数据包文件&#xff0c;并想要筛选指定 IP 地址和端口的包时&#xff0c;你可以在命令中直接加入过滤表达式。这些过滤表达式可以…

SpringMVC(三)【REST 风格】

1、REST 风格 1.1、REST 简介 REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表现形式状态转换 在开发中&#xff0c;它其实指的就是访问网络资源的格式 1.1.1、传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user…

吴恩达机器学习笔记 三十五 异常检测与监督学习

什么时候选择异常检测&#xff1f; 正样本 ( y 1 ) 的数量非常少 负样本 ( y 0 ) 的数量非常多 有很多不同的异常&#xff0c;现有的算法不能从正样本中得知什么是异常&#xff0c;或未来可能出现完全没见过的异常情况。 例如金融欺诈&#xff0c;隔几个月或几年就有新的…

智慧公厕是如何诞生的?

在城市化进程中&#xff0c;公共卫生设施的建设一直是重要议题之一。而随着科技的不断发展&#xff0c;智慧公厕作为一种创新的解决方案&#xff0c;逐渐成为了现代城市管理的亮点。那么&#xff0c;智慧公厕是如何产生的呢&#xff1f; 一、城市化进程的推动 城市人口的增加和…

vue elmentui 可编辑table 实现

废话不多说上图&#xff1a; 1.可编辑input 2.可编辑下来框 3.点击chechbox 4.可编辑radio 其实后面两种可以直接显示值 需要修改直接改就行 保持风格统一所以就做了点击之后出现修改功能 上代码&#xff0c;不要哔哔 哈哈 粗暴 真得是曲不离口 拳不离手&#xff0c; 几天…

java学习笔记5

9. 类和对象 9.1 类 9.1.1 类的定义 ​ 类是具有相同属性和方法的具体实例的集合,类是对象的抽象,对象是类的具体实例 9.1.2 类语法 public class 类名{// 1. 属性public 变量的类型 变量名称1;public 变量的类型 变量名称2;...// 2. 方法public void 方法1(){}public v…

pandas/python 一个实战小案例

上次写坦克游戏的时候&#xff0c;接触了一点pandas&#xff0c;当时只是简单了解了一下如何遍历行和列并获取值来替换图片&#xff0c;想更多了解pandas。正好有一些数据需要筛选&#xff0c;试试能不能用通过代码实现。虽然总的来说不复杂&#xff0c;但由于原始数据在命名、…

【重要】Perplexity订阅问题看这一篇就够了!Perplexity免费版和订阅版区别?免费使用G|P|T-4!

常见问题 Q&#xff1a;Perplexity是什么&#xff1f;Perplexity有什么用&#xff1f; A&#xff1a;Perplexity是一个AI搜索引擎&#xff0c;可以理解为可以检索网络结果的G|P|T&#xff0c;尤其是选中“Academic”后支持特定学术论文的检索。并且文献是真是可查到的而不是G|P…

启明智显应用分享|基于ESP32-S3方案的SC01PLUS彩屏与chatgpt融合应用DEMO

今天将带大家真实体验科技与智慧的完美融合——SC01PLUS与ChatGPT的深度融合DEMO效果呈现。 彩屏的清晰显示与ChatGPT的精准回答&#xff0c;将为我们带来前所未有的便捷与高效。 SC01PLUS是启明智显基于ESP32-S3打造的一款3.5寸480*320分辨率的彩屏产品&#xff0c;您可以看…

【算法刷题 | 回溯思想 06】4.17(子集、子集||)

文章目录 9.子集9.1题目9.2解法&#xff1a;回溯9.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;终止条件&#xff08;3&#xff09;遍历过程 9.2.2代码实现 10.子集 ||10.1题目10.2解法&#xff1a;回溯10.2.1回溯思路10.2.2代码实现 9.子…

SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出

目录 介绍 快速开始 引入依赖 简单导出 定义实体类 自定义转换器 定义接口 测试接口 复杂导出 自定义注解 定义实体类 数据映射与平铺 自定义单元格合并策略 定义接口 测试接口 一对多导出 自定义单元格合并策略 测试数据 简单导入 定义接口 测试接口 参…

畅游网络:构建C++网络爬虫的指南

概述 随着信息时代的来临&#xff0c;网络爬虫技术成为数据采集和网络分析的重要工具。本文旨在探讨如何运用C语言及其强大的cpprestsdk库构建一个高效的网络爬虫&#xff0c;以便捕捉知乎等热点信息。为了应对IP限制的挑战&#xff0c;我们将引入亿牛云爬虫代理服务&#xff…