当前位置: 首页 > news >正文

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:可捕获和处理的异常,分为运行时异常和编译时异常。
    • 非运行时异常:需要显式处理的异常,如 IOExceptionSQLException 等。
    • 运行时异常:程序运行时可能发生,但不需要显式捕获和处理的异常,如 NullPointerExceptionArithmeticException 等。

异常处理方法

  • 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.如何自定义异常类

自定义异常类用于处理程序中特定的异常情况。自定义异常通常继承自 ExceptionRuntimeException,并提供有意义的异常信息。

步骤

  1. 创建一个类继承 ExceptionRuntimeException
  2. 提供一个构造方法来传递错误消息或其他相关信息。
  3. 在需要的地方通过 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 异常:IOExceptionSQLException 等。

Unchecked 异常

  • 定义:Unchecked 异常是运行时异常,程序员可以选择处理,但不强制要求处理。
  • 特点
    • 继承自 RuntimeException
    • 如果不处理,程序在运行时可能会中断,但编译不会报错。
    • 常见的 Unchecked 异常:NullPointerExceptionArrayIndexOutOfBoundsException 等。

示例

// 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. 如何处理数据库事务中的异常

在处理数据库事务时,异常的管理非常关键。为了保证数据的完整性和一致性,当事务处理出现异常时,通常需要进行回滚操作。

常见场景

  • 提交事务:在操作完成后,提交数据库事务。
  • 回滚事务:在发生异常时,撤销事务操作。

处理方式

  1. 开启事务:在执行数据库操作前,开启事务。
  2. 捕获异常:使用 try-catch 捕获数据库操作中的异常。
  3. 回滚事务:在异常块中进行回滚操作。
  4. 提交事务:在所有操作成功时提交事务。
  5. 释放资源:在 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 中有着明确的区分,前者需要显式处理,后者可选择处理。
  • 数据库事务中的异常处理不仅要捕获和回滚异常,还需要确保事务的一致性和完整性。
http://www.lryc.cn/news/467157.html

相关文章:

  • 6.1 特征值介绍
  • Vue01
  • MySQL - Navicat自动备份MySQL数据
  • 系统分析师20:【案例特训专题3】系统设计与运维
  • Linux 局域网中使用NTP配置时间服务
  • Shiro会话管理和加密
  • GPON、XG-PON和XGS-PON的区别
  • Spring 项目返回值枚举类编写技巧
  • 【操作系统】06.进程控制
  • 16天自制CppServer-day02
  • 时空智友企业流程化管控系统uploadStudioFile接口存在任意文件上传漏洞
  • Linux 中文件的权限说明
  • MySql数据库中数据类型
  • Godot中的信号
  • vba学习系列(8)--指定列单元格时间按时间段计数
  • 大型企业软件开发是什么样子的? - Web Dev Cody
  • 【stm32】DMA的介绍与使用
  • 哈希表的魔力
  • 《YOLO 目标检测》—— YOLO v3 详细介绍
  • WNN 多模态整合 | Seurat 单细胞多组学整合流程
  • 【Linux】磁盘文件系统(inode)、软硬链接
  • 网安加·百家讲坛 | 徐一丁:金融机构网络安全合规浅析
  • 九、pico+Unity交互开发——触碰抓取
  • 老机MicroServer Gen8再玩 OCP万兆光口+IT直通
  • jmeter 从多个固定字符串中随机取一个值的方法
  • priority_queue (优先级队列的使用和模拟实现)
  • VisionPro 手部骨骼跟踪 Skeletal Hand Tracking 虚拟首饰
  • class 9: vue.js 3 组件化基础(2)父子组件间通信
  • Laravel|Lumen项目配置信息config原理
  • 2024系统分析师考试---论区块链技术及其应用