Java 中的异常处理、常见异常、如何自定义异常类、Checked 和 Unchecked 异常的区别、如何处理数据库事务中的异常
文章目录
- 1. 异常的基本概念与处理方法
- 定义
- 常见异常类
- 补充说明:
- 异常处理方法
- 示例
- 2.如何自定义异常类
- 步骤
- 示例
- 3. Java 中的 Checked 和 Unchecked 异常的区别
- Checked 异常
- Unchecked 异常
- 示例
- 4. 如何处理数据库事务中的异常
- 常见场景
- 处理方式
- 示例
- 讨论
- 总结
异常是指程序在运行时出现的错误或意外情况。Java 提供了异常处理机制来捕获和处理这些异常,以确保程序在遇到问题时能够有适当的响应而不崩溃。
1. 异常的基本概念与处理方法
定义
异常是 Java 中的对象,表示程序执行过程中发生的异常情况。所有异常类都是从 java.lang.Throwable
类派生的。异常处理是指通过 try-catch-finally
块或 throws
关键字来捕获和处理异常。
常见异常类
父类 | 异常类 | 描述 |
---|---|---|
Throwable | 所有错误和异常的父类。 | |
Error | 一般表示系统级错误,通常程序无法处理。 | |
OutOfMemoryError | ||
StackOverflowError | ||
NoClassDefFoundError | ||
Exception | 所有可捕获异常的父类。 | |
非运行时异常(编译时异常) | ||
ClassNotFoundException | ||
IOException | ||
FileNotFoundException | ||
SQLException | ||
运行时异常 | ||
RuntimeException | ||
ArithmeticException | ||
IllegalArgumentException | ||
NullPointerException | ||
IndexOutOfBoundsException |
补充说明:
Error
:系统级错误,程序通常无法处理。Exception
:可捕获和处理的异常,分为运行时异常和编译时异常。- 非运行时异常:需要显式处理的异常,如
IOException
、SQLException
等。 - 运行时异常:程序运行时可能发生,但不需要显式捕获和处理的异常,如
NullPointerException
、ArithmeticException
等。
- 非运行时异常:需要显式处理的异常,如
异常处理方法
try-catch
块:用于捕获和处理异常。finally
块:无论是否抛出异常,finally
块中的代码都会执行。throws
关键字:用于方法声明,表示该方法可能抛出某些异常。throw
关键字:用于显式抛出异常。
示例
public void divide(int a, int b) {try {int result = a / b; // 可能抛出ArithmeticException} catch (ArithmeticException e) {System.out.println("除数不能为0");} finally {System.out.println("运算完成");}
}
2.如何自定义异常类
自定义异常类用于处理程序中特定的异常情况。自定义异常通常继承自 Exception
或 RuntimeException
,并提供有意义的异常信息。
步骤
- 创建一个类继承
Exception
或RuntimeException
。 - 提供一个构造方法来传递错误消息或其他相关信息。
- 在需要的地方通过
throw
抛出该自定义异常。
示例
class InvalidAgeException extends Exception {public InvalidAgeException(String message) {super(message);}
}public class Person {public void setAge(int age) throws InvalidAgeException {if (age < 0) {throw new InvalidAgeException("年龄不能为负数");}}
}
3. Java 中的 Checked 和 Unchecked 异常的区别
Checked 异常
- 定义:Checked 异常是编译时异常,必须通过
try-catch
块处理或使用throws
关键字声明。 - 特点:
- 需要程序员显式处理。
- 继承自
Exception
类,但不包括RuntimeException
。 - 常见的 Checked 异常:
IOException
、SQLException
等。
Unchecked 异常
- 定义:Unchecked 异常是运行时异常,程序员可以选择处理,但不强制要求处理。
- 特点:
- 继承自
RuntimeException
。 - 如果不处理,程序在运行时可能会中断,但编译不会报错。
- 常见的 Unchecked 异常:
NullPointerException
、ArrayIndexOutOfBoundsException
等。
- 继承自
示例
// Checked 异常
public void readFile(String fileName) throws IOException {FileReader file = new FileReader(fileName); // 编译时异常,必须处理
}// Unchecked 异常
public void divide(int a, int b) {int result = a / b; // 运行时异常,程序员可以选择处理或不处理
}
4. 如何处理数据库事务中的异常
在处理数据库事务时,异常的管理非常关键。为了保证数据的完整性和一致性,当事务处理出现异常时,通常需要进行回滚操作。
常见场景
- 提交事务:在操作完成后,提交数据库事务。
- 回滚事务:在发生异常时,撤销事务操作。
处理方式
- 开启事务:在执行数据库操作前,开启事务。
- 捕获异常:使用
try-catch
捕获数据库操作中的异常。 - 回滚事务:在异常块中进行回滚操作。
- 提交事务:在所有操作成功时提交事务。
- 释放资源:在
finally
块中释放数据库连接等资源。
示例
Connection conn = null;
try {conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "password");conn.setAutoCommit(false); // 开启事务// 执行数据库操作// ...conn.commit(); // 提交事务
} catch (SQLException e) {if (conn != null) {try {conn.rollback(); // 回滚事务} catch (SQLException ex) {ex.printStackTrace();}}e.printStackTrace();
} finally {if (conn != null) {try {conn.close(); // 释放连接} catch (SQLException e) {e.printStackTrace();}}
}
讨论
- 事务回滚:确保在发生异常时能够撤销对数据库的操作,保证数据的完整性和一致性。
- 异常日志记录:记录异常信息以便后续调试和错误分析。
- 重试机制:在某些情况下,数据库操作失败后,可以引入重试机制,以应对短暂的网络问题或数据库锁等情况。
总结
- 异常处理是 Java 程序设计的重要组成部分,通过
try-catch-finally
和自定义异常类,可以有效地捕获并处理运行时异常。 - Checked 和 Unchecked 异常在 Java 中有着明确的区分,前者需要显式处理,后者可选择处理。
- 数据库事务中的异常处理不仅要捕获和回滚异常,还需要确保事务的一致性和完整性。
相关文章:
Java 中的异常处理、常见异常、如何自定义异常类、Checked 和 Unchecked 异常的区别、如何处理数据库事务中的异常
文章目录 1. 异常的基本概念与处理方法定义常见异常类补充说明: 异常处理方法示例 2.如何自定义异常类步骤示例 3. Java 中的 Checked 和 Unchecked 异常的区别Checked 异常Unchecked 异常示例 4. 如何处理数据库事务中的异常常见场景处理方式示例讨论 总结 异常是指…...

6.1 特征值介绍
一、特征值和特征向量介绍 本章会开启线性代数的新内容。前面的第一部分是关于 A x b A\boldsymbol x\boldsymbol b Axb:平衡、均衡和稳定状态;现在的第二部分是关于变化的。时间会加入进来 —— 连续时间的微分方程 d u / d t A u \pmb{\textrm{d}…...

Vue01
前端最新Vue2Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1HV4y1a7n4?spm_id_from333.788.videopod.episodes&vd_source016213ecd945408976ff307a6bda30…...

MySQL - Navicat自动备份MySQL数据
对于从事IT开发的工程师,数据备份我想大家并不陌生,这件工程太重要了!对于比较重要的数据,我们希望能定期备份,每天备份1次或多次,或者是每周备份1次或多次。 如果大家在平时使用Navicat操作数据库&#x…...

系统分析师20:【案例特训专题3】系统设计与运维
1 Web开发 1.1 Web开发涉及技术的综合应用 高性能高可用可维护应变安全 1.2 Web系统架构演化过程 1.2.1 单台机器到数据库与Web服务器分离 早期的web系统往往以单台机器形态出现,web网站无论是前端还是后台数据库都部署在一台服务器上,部署起来比较…...
Linux 局域网中使用NTP配置时间服务
一:NTP 时间服务器配置 前提: 局域网环境中一般不能直接使用互联网上提供的时间服务器,例如ntp.aliyun.com。所以可以使用局域网中的一个服务器时间为基准,其他服务器的时间都和他保持一致。 1、将服务器的系统时间配置为时间源…...
Shiro会话管理和加密
一、会话相关API及会话使用 Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Web容器Tomcat),可以在JavaSE和JavaEE环境中使用。会话相关API主要包括: Subject.getSession(): 获取当前用户的会话࿰…...

GPON、XG-PON和XGS-PON的区别
类别GPON10G PON 细分 GPON XG-PON XGS-PON 下行速率 2.488 Gbps 9.953 Gbps 9.953Gbps 上行速率 1.244 Gbps 2.488 Gbps 9.953Gbps 可用带宽 2200Mbps 8500Mbps 8500Mbps 1000Mbps2000Mbps8500Mbps ITU-T标准 G.984(2003年) G.987 &a…...
Spring 项目返回值枚举类编写技巧
Spring 项目返回值枚举类编写技巧 在 Spring 项目中,使用枚举类来统一管理返回值和状态码是一种非常优雅的实现方式。这不仅能提升代码的可读性和维护性,还能避免在代码中硬编码字符串或数字来表示状态码。本文将以 ReturnCodeEnum 为例,介绍…...

【操作系统】06.进程控制
一、进程创建 1.1 认识fork函数 在linux中fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 进程调用fork,当控制转移到内核中的fork代码后,内核将 分配新的内存块和内核数据结构…...
16天自制CppServer-day02
day02-设置错误与异常处理机制 上一天我们写了一个客户端与服务器通过socket进行连接,对socket,bind,listen,accept,connect等函数,我们都设想程序完美地、没有任何异常地运行,但显然这不现实,应该设置出现异常的处理机制&#x…...

时空智友企业流程化管控系统uploadStudioFile接口存在任意文件上传漏洞
免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 时空智友…...

Linux 中文件的权限说明
目录 一:文件权限类型二:默认权限管理1. 查看当前用户的umask值2. 修改当前用户的umask值3. 根据umask计算默认权限 三:普通权限管理1. 三种普通权限说明1.1 对于非目录文件来说1.2 对于目录文件来说 2. 查看某个文件的权限信息2.1 使用 ls -…...

MySql数据库中数据类型
本篇将介绍在 MySql 中的所有数据类型,其中主要分为四类:数值类型、文本和二进制类型、时间日期、String 类型。如下(图片来源:MySQL数据库): 目录如下: 目录 数值类型 1. 整数类型 2. …...

Godot中的信号
目录 概念 signal connect方法连接Callable 信号要求参数 查看信号 连接信号 监听信号 Button - text属性 pressed 连接源 「按钮」的信号连接 使用代码,将方法与信号相连接 节点的connect方法 节点直接使用emit_signal方法通过字符串的方式触发信号…...
vba学习系列(8)--指定列单元格时间按时间段计数
系列文章目录 文章目录 系列文章目录前言一、背景二、VBA总结 前言 一、背景 时间格式:00:00:00 时间段格式:00:00:00 - 01:00:00 计数N列单元格时间位于时间段内的行数 二、VBA 代码如下(示例): Sub AssignTimeSeg…...

大型企业软件开发是什么样子的? - Web Dev Cody
引用自大型企业软件开发是什么样子的? - Web Dev Cody_哔哩哔哩_bilibili 一般来说 学技术的时候 我们会关注 开发语言特性 ,各种高级语法糖,底层技术 但是很少有关注到企业里面的开发流程,本着以终为始(以就业为导向…...

【stm32】DMA的介绍与使用
DMA的介绍与使用 1、DMA简介2、存储器映像3、DMA框图4、DMA基本结构5、DMA请求6、数据宽度与对齐7、数据转运DMA(存储器到存储器的数据转运)程序编写: 8、ADC连续扫描模式DMA循环转运DMA配置:程序编写: 1、DMA简介 DM…...

哈希表的魔力
哈希表与字典 普遍存在一种误解,认为“哈希表”和“字典”这两个术语可以互换。这种观念从根本上是不准确的,至少在计算机科学领域是如此。 字典是将键映射到值的数据结构的一般概念。而哈希表是字典的具体实现。 本质上,字典扮演着一个总体…...

《YOLO 目标检测》—— YOLO v3 详细介绍
!!!!!!!!!!!!!还未写完!!!!!!!…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...