异常处理学习笔记

一、异常概述

异常是程序运行过程中出现的非正常情况,它会中断程序的正常执行流程。Java通过异常处理机制使程序更加健壮稳定。

异常分类

类型 特点 示例
检查型异常(Checked Exception) 编译时必须处理,否则无法通过编译 IOException, SQLException
运行时异常(Runtime Exception) 编译时不检查,运行时才会出现 NullPointerException, ArrayIndexOutOfBoundsException
错误(Error) 严重问题,通常无法处理 OutOfMemoryError, StackOverflowError

二、异常处理机制

1. try-catch语句

语法结构:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e1) {
    // 处理第一种异常
} catch (ExceptionType2 e2) {
    // 处理第二种异常
}

示例:

try {
    int[] arr = {1, 2, 3};
    System.out.println(arr[5]); // 数组越界
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("数组越界异常:" + e.getMessage());
}

2. finally语句

特点:

  • 无论是否发生异常都会执行

  • 常用于资源释放

示例:

FileInputStream fis = null;
try {
    fis = new FileInputStream("file.txt");
    // 文件操作
} catch (FileNotFoundException e) {
    System.out.println("文件未找到");
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    System.out.println("资源清理完成");
}

3. throw关键字

作用: 手动抛出异常

示例:

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

4. throws关键字

作用: 声明方法可能抛出的异常

示例:

public void readFile() throws IOException {
    FileInputStream fis = new FileInputStream("file.txt");
}

三、自定义异常

创建步骤

  1. 继承Exception类(检查型异常)或RuntimeException类(运行时异常)

  2. 添加构造方法

  3. (可选)添加自定义属性和方法

示例代码

public class InvalidValueException extends Exception {
    private int invalidValue;
    
    public InvalidValueException(String message, int value) {
        super(message);
        this.invalidValue = value;
    }
    
    public int getInvalidValue() {
        return invalidValue;
    }
}
public class Validator {
    public void checkValue(int value) throws InvalidValueException {
        if (value < 0) {
            throw new InvalidValueException("值不能为负数", value);
        }
    }
}

四、最佳实践

  1. 合理使用异常

    • 不要用异常控制正常流程

    • 异常应仅用于处理异常情况

  2. 精确捕获异常

    • 避免直接捕获Exception

    • 捕获最具体的异常类型

  3. 资源管理

    • 使用try-with-resources语句

    try (FileInputStream fis = new FileInputStream("file.txt")) {
        // 使用资源
    } catch (IOException e) {
        e.printStackTrace();
    }
  4. 异常记录

    • 记录异常堆栈信息

    • 使用日志框架如Log4j、SLF4J

  5. 避免处理Error

    • 不要捕获Error及其子类

    • 这类错误通常无法恢复

  6. 异常信息

    • 提供有意义的异常信息

    • 便于问题排查

  7. 异常链

    • 保留原始异常信息

    try {
        // 某些操作
    } catch (IOException e) {
        throw new MyException("操作失败", e); // 传递原始异常
    }

总结

Java异常处理机制是编写健壮程序的重要组成部分。合理使用try-catch-finally结构,正确区分检查型异常和运行时异常,遵循最佳实践,能够显著提高代码的质量和可靠性。自定义异常可以更好地表达特定的业务错误情况。

你可能感兴趣的:(学习,笔记,python)