Java中异常、异常分类、异常防护分别是什么

发布时间:2021-06-18 10:25:16 作者:chen
来源:亿速云 阅读:181
# 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异常的分类

2.1 Throwable类层次结构

Java异常体系的根类是java.lang.Throwable,主要分为两大类:

Throwable
├── Error(系统级错误)
└── Exception(可处理的异常)
    ├── RuntimeException(运行时异常)
    └── 非RuntimeException(检查型异常)

2.2 检查型异常(Checked Exceptions)

特点: - 必须显式处理(捕获或声明抛出) - 继承自Exception但不继承RuntimeException - 代表可预期的异常情况

常见检查型异常: - IOException - SQLException - ClassNotFoundException

// 必须处理检查型异常
public void readFile() {
    try {
        Files.readString(Path.of("nonexistent.txt"));
    } catch (IOException e) { // 必须捕获
        System.err.println("文件读取失败: " + e.getMessage());
    }
}

2.3 非检查型异常(Unchecked Exceptions)

特点: - 不强制要求处理 - 继承自RuntimeException - 通常代表编程错误

常见非检查型异常: - NullPointerException - ArrayIndexOutOfBoundsException - IllegalArgumentException

// 非检查型异常可不处理
public void divide(int a, int b) {
    System.out.println(a / b); // 可能抛出ArithmeticException
}

2.4 Error与Exception的区别

特性 Error Exception
严重程度 系统级严重错误 可处理的异常情况
是否可恢复 通常不可恢复 多数可以恢复
示例 OutOfMemoryError IOException
处理建议 不推荐捕获 应该适当处理

异常防护机制

3.1 try-catch-finally块

基本结构:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e1) {
    // 处理特定异常
} catch (ExceptionType2 e2) {
    // 处理另一种异常
} finally {
    // 无论是否发生异常都会执行
    // 常用于资源释放
}

多捕获语法(Java 7+):

try {
    // ...
} catch (IOException | SQLException e) {
    // 同时捕获多种异常
}

3.2 throws关键字

方法声明时抛出异常:

public void riskyMethod() throws IOException, SQLException {
    // 方法可能抛出这些异常
}

3.3 throw关键字

主动抛出异常:

if (age < 0) {
    throw new IllegalArgumentException("年龄不能为负数");
}

3.4 自定义异常

创建自定义异常类:

public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(double amount) {
        super("资金不足,缺少: " + amount);
    }
}

// 使用示例
throw new InsufficientFundsException(100.50);

3.5 try-with-resources

自动资源管理(Java 7+):

try (InputStream is = new FileInputStream("test.txt");
     OutputStream os = new FileOutputStream("output.txt")) {
    // 自动关闭资源
} catch (IOException e) {
    e.printStackTrace();
}

最佳实践

  1. 具体异常优先:捕获最具体的异常类型 “`java // 不推荐 catch (Exception e)

// 推荐 catch (FileNotFoundException e)


2. **避免空catch块**:至少记录异常信息
   ```java
   catch (SQLException e) {
       logger.error("数据库操作失败", e);
   }
  1. finally中避免return:会导致异常被”吞没”

    // 危险代码
    finally {
       return; // 可能掩盖异常
    }
    
  2. 异常转换:将底层异常转换为业务异常

    try {
       // ...
    } catch (SQLException e) {
       throw new BusinessException("数据库操作失败", e);
    }
    
  3. 性能考虑:异常处理比正常流程慢100倍


总结

Java异常处理机制提供了完善的错误管理方案: - 异常分类:检查型异常强制处理,非检查型异常灵活处理 - 防护机制:try-catch-finally基础结构,throws/throw控制异常传播 - 现代特性:try-with-resources简化资源管理 - 扩展能力:支持自定义异常类型

正确使用异常处理可以使程序: ✓ 更健壮 ✓ 更易维护 ✓ 更安全

“优秀的异常处理不是事后补救,而是系统设计的一部分” ——《Effective Java》 “`

(注:实际字数约2500字,可根据需要增减具体示例或扩展说明部分内容)

推荐阅读:
  1. JAVA异常分类及处理的方法
  2. java中的异常

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:JavaScript制作轮播图的的示例代码

下一篇:python清洗文件中数据的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》