跳转至

异常处理

定义

异常处理是Java中用于处理程序运行时出现的错误或异常情况的机制,主要包括try-catch-finally、throw和throws等关键字。

作用

异常处理在实际开发中具有以下重要价值: 1. 错误处理:优雅地处理程序错误 2. 程序健壮性:提高程序的可靠性 3. 资源管理:确保资源正确释放 4. 调试信息:提供详细的错误信息 5. 代码可维护性:提高代码的可维护性

图表说明

try-catch-finally流程

graph TD
    A[开始] --> B[执行try块]
    B --> C{是否发生异常?}
    C -->|是| D[执行catch块]
    C -->|否| E[执行finally块]
    D --> E
    E --> F[结束]

异常传播流程

graph TD
    A[方法A] --> B[方法B]
    B --> C[方法C]
    C --> D{发生异常}
    D -->|未捕获| E[向上传播]
    E --> F[方法B捕获]
    F --> G[处理异常]
    G --> H[继续执行]

例子

import java.io.File;
import java.io.FileNotFoundException;

public class ExceptionDemo {
    public static void main(String[] args) {
        // try-catch示例
        System.out.println("try-catch示例:");
        try {
            int result = divide(10, 0);
            System.out.println("结果: " + result);
        } catch (ArithmeticException e) {
            System.out.println("捕获到异常: " + e.getMessage());
        }

        // try-catch-finally示例
        System.out.println("try-catch-finally示例:");
        try {
            int[] arr = new int[5];
            System.out.println(arr[10]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界: " + e.getMessage());
        } finally {
            System.out.println("finally块总是执行");
        }

        // 多重catch示例
        System.out.println("多重catch示例:");
        try {
            String str = null;
            System.out.println(str.length());
        } catch (NullPointerException e) {
            System.out.println("空指针异常: " + e.getMessage());
        } catch (Exception e) {
            System.out.println("其他异常: " + e.getMessage());
        }

        // throws示例
        System.out.println("throws示例:");
        try {
            readFile("test.txt");
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到: " + e.getMessage());
        }
    }

    // 除法运算
    public static int divide(int a, int b) {
        return a / b;
    }

    // 读取文件
    public static void readFile(String filename) throws FileNotFoundException {
        File file = new File(filename);
        if (!file.exists()) {
            throw new FileNotFoundException("文件不存在: " + filename);
        }
    }
}

执行结果

try-catch示例:
捕获到异常: / by zero
try-catch-finally示例:
数组越界: 10
finally块总是执行
多重catch示例:
空指针异常: null
throws示例:
文件未找到: 文件不存在: test.txt

详细说明

  1. try-catch-finally结构:

    • try块包含可能异常的代码
    • catch块处理特定类型的异常
    • finally块确保资源释放
    • 可以嵌套使用
  2. throw和throws:

    • throw用于抛出异常
    • throws声明可能抛出的异常
    • 可以抛出自定义异常
    • 必须处理或声明异常
  3. 异常类型:

    • 检查型异常(Checked)
    • 运行时异常(Runtime)
    • 错误(Error)
    • 自定义异常

推演说明

  1. 异常处理流程:

    • 执行try块代码
    • 发生异常时跳转
    • 匹配catch块处理
    • 执行finally块
    • 继续后续代码
  2. 异常传播流程:

    • 方法抛出异常
    • 向上层方法传播
    • 直到被捕获处理
    • 或程序终止

注意事项

  1. 合理使用异常处理
  2. 避免空的catch块
  3. 正确关闭资源
  4. 注意异常粒度
  5. 保持异常信息完整