Java 异常处理

Java 异常处理

一、什么是异常

程序运行时出现的非正常错误,会中断正常执行流程。

异常体系顶层父类:java.lang.Throwable,分两大分支:

  1. Error 错误:系统级严重故障(内存溢出、栈溢出),代码无法处理,不用捕获。
  2. Exception 异常 :程序可处理的问题,分为两类:
    • 受检异常(编译期异常):必须捕获/声明抛出,如IO、文件、SQL异常
    • 运行时异常(RuntimeException):编译不报错,运行才出现,如空指针、数组越界

二、核心关键字:try-catch-finally、throw、throws

1. try-catch-finally 捕获处理异常

  • try:存放可能出错的代码
  • catch:捕获对应类型异常,做补救逻辑
  • finally:无论是否异常、是否return,一定会执行,常用于释放资源(文件、流、连接)
java 复制代码
public static void test() {
    try {
        int a = 1 / 0;
    } catch (ArithmeticException e) {
        System.out.println("除数不能为0");
        e.printStackTrace(); // 打印异常堆栈
    } finally {
        System.out.println("代码最终执行");
    }
}

多catch写法:先小异常,后大异常

java 复制代码
try {
} catch (NullPointerException e) {
} catch (Exception e) {
}

2. throws 声明抛出异常

方法自己不处理,把异常抛给调用者,写在方法参数后。

受检异常必须throws,运行时异常可省略

java 复制代码
// 声明抛出文件异常
public void readFile() throws FileNotFoundException {
    new FileReader("test.txt");
}

3. throw 手动抛出异常

主动制造异常对象抛出,多用于参数校验

java 复制代码
public void setAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("年龄不能为负数");
    }
}

三、try-with-resources 自动关闭资源

实现 AutoCloseable 的流/连接,无需手动在finally关闭,自动释放:

java 复制代码
try (FileInputStream fis = new FileInputStream("1.txt")) {
    fis.read();
} catch (IOException e) {
    e.printStackTrace();
}

四、自定义异常

业务场景专用,继承Exception(受检)或RuntimeException(运行时)

java 复制代码
// 自定义运行时异常
public class UserException extends RuntimeException {
    public UserException(String msg) {
        super(msg);
    }
}
// 使用
throw new UserException("用户不存在");

五、执行顺序规则

  1. try正常无异常:try → finally
  2. try出现异常被catch:try → catch → finally
  3. try/catch里写return:先执行finally,再return
  4. finally不能执行唯一情况:System.exit(0) 直接终止JVM

六、常见面试要点

  1. Error和Exception区别;运行时异常与受检异常区别
  2. finally一定会执行吗?System.exit会跳过
  3. throw和throws区别:throw抛对象,throws声明方法异常
  4. try-with-resources作用:自动关闭IO资源
  5. 多层异常捕获顺序:子类异常放前面,父类放最后
  6. 异常不要吞掉:禁止空catch{},至少打印日志