您好,登录后才能下订单哦!
# Java中异常、异常分类、异常防护分别是什么
## 目录
1. [什么是异常](#什么是异常)
2. [Java异常的分类](#java异常的分类)
- [2.1 Throwable类层次结构](#21-throwable类层次结构)
- [2.2 检查型异常(Checked Exceptions)](#22-检查型异常checked-exceptions)
- [2.3 非检查型异常(Unchecked Exceptions)](#23-非检查型异常unchecked-exceptions)
- [2.4 Error与Exception的区别](#24-error与exception的区别)
3. [异常防护机制](#异常防护机制)
- [3.1 try-catch-finally块](#31-try-catch-finally块)
- [3.2 throws关键字](#32-throws关键字)
- [3.3 throw关键字](#33-throw关键字)
- [3.4 自定义异常](#34-自定义异常)
- [3.5 try-with-resources](#35-try-with-resources)
4. [最佳实践](#最佳实践)
5. [总结](#总结)
---
## 什么是异常
在Java编程中,**异常(Exception)**是指程序运行时发生的非预期事件,它会中断正常的指令流。例如:
- 访问null对象的成员时抛出`NullPointerException`
- 数组越界访问时抛出`ArrayIndexOutOfBoundsException`
- 文件不存在时抛出`FileNotFoundException`
异常处理的核心目标是:
1. 将错误处理代码与业务逻辑分离
2. 提供程序容错能力
3. 便于调试和问题追踪
```java
// 典型异常示例
public class Main {
public static void main(String[] args) {
String str = null;
System.out.println(str.length()); // 抛出NullPointerException
}
}
Java异常体系的根类是java.lang.Throwable
,主要分为两大类:
Throwable
├── Error(系统级错误)
└── Exception(可处理的异常)
├── RuntimeException(运行时异常)
└── 非RuntimeException(检查型异常)
特点:
- 必须显式处理(捕获或声明抛出)
- 继承自Exception
但不继承RuntimeException
- 代表可预期的异常情况
常见检查型异常:
- IOException
- SQLException
- ClassNotFoundException
// 必须处理检查型异常
public void readFile() {
try {
Files.readString(Path.of("nonexistent.txt"));
} catch (IOException e) { // 必须捕获
System.err.println("文件读取失败: " + e.getMessage());
}
}
特点:
- 不强制要求处理
- 继承自RuntimeException
- 通常代表编程错误
常见非检查型异常:
- NullPointerException
- ArrayIndexOutOfBoundsException
- IllegalArgumentException
// 非检查型异常可不处理
public void divide(int a, int b) {
System.out.println(a / b); // 可能抛出ArithmeticException
}
特性 | Error | Exception |
---|---|---|
严重程度 | 系统级严重错误 | 可处理的异常情况 |
是否可恢复 | 通常不可恢复 | 多数可以恢复 |
示例 | OutOfMemoryError |
IOException |
处理建议 | 不推荐捕获 | 应该适当处理 |
基本结构:
try {
// 可能抛出异常的代码
} catch (ExceptionType1 e1) {
// 处理特定异常
} catch (ExceptionType2 e2) {
// 处理另一种异常
} finally {
// 无论是否发生异常都会执行
// 常用于资源释放
}
多捕获语法(Java 7+):
try {
// ...
} catch (IOException | SQLException e) {
// 同时捕获多种异常
}
方法声明时抛出异常:
public void riskyMethod() throws IOException, SQLException {
// 方法可能抛出这些异常
}
主动抛出异常:
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
创建自定义异常类:
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(double amount) {
super("资金不足,缺少: " + amount);
}
}
// 使用示例
throw new InsufficientFundsException(100.50);
自动资源管理(Java 7+):
try (InputStream is = new FileInputStream("test.txt");
OutputStream os = new FileOutputStream("output.txt")) {
// 自动关闭资源
} catch (IOException e) {
e.printStackTrace();
}
// 推荐 catch (FileNotFoundException e)
2. **避免空catch块**:至少记录异常信息
```java
catch (SQLException e) {
logger.error("数据库操作失败", e);
}
finally中避免return:会导致异常被”吞没”
// 危险代码
finally {
return; // 可能掩盖异常
}
异常转换:将底层异常转换为业务异常
try {
// ...
} catch (SQLException e) {
throw new BusinessException("数据库操作失败", e);
}
性能考虑:异常处理比正常流程慢100倍
Java异常处理机制提供了完善的错误管理方案: - 异常分类:检查型异常强制处理,非检查型异常灵活处理 - 防护机制:try-catch-finally基础结构,throws/throw控制异常传播 - 现代特性:try-with-resources简化资源管理 - 扩展能力:支持自定义异常类型
正确使用异常处理可以使程序: ✓ 更健壮 ✓ 更易维护 ✓ 更安全
“优秀的异常处理不是事后补救,而是系统设计的一部分” ——《Effective Java》 “`
(注:实际字数约2500字,可根据需要增减具体示例或扩展说明部分内容)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。