一、什么是异常Exception?

异常是程序运行过程中突发的、干扰正常执行流程的意外情况,如文件找不到、网络连接失败、非法参数传入、数组下标越界等。这类情况会打破程序预设的执行逻辑,若未妥善处理,可能导致程序崩溃或输出错误结果。

异常与 “错误(Error)” 不同:异常是程序可感知并尝试修复的问题,而错误(如栈溢出、内存溢出)通常是 JVM 级别的严重故障,程序难以处理

二、异常体系结构

Java 异常体系以java.lang.Throwable为顶层父类,

包含两大核心分支:Error(错误) 和 Exception(异常),二者均包含具体子类以对应不同场景。

1.顶层父类:Throwable

所有异常和错误的根类,提供了获取异常信息、打印堆栈跟踪等核心方法(如getMessage()printStackTrace())。

2.分支一:Error(错误)

JVM 抛出的严重问题,程序无法处理,通常需通过修改代码或调整运行环境解决,常见子类:

  • StackOverflowError:栈溢出(如递归调用无终止条件)。
  • OutOfMemoryError(OOM):内存溢出(如创建大量对象未回收)。
  • NoClassDefFoundError:类定义未找到(如类路径缺失)。
3.分支二:Exception(异常)

程序可捕获并处理的问题,是异常处理的核心,又分为两类:

  • 受检异常(Checked Exception):非RuntimeException子类,编译期强制要求处理(捕获或声明抛出),如IOException(文件读写异常)、SQLException(数据库操作异常)。
  • 非受检异常(Unchecked Exception)RuntimeException的子类,编译期不强制处理,多由程序逻辑错误导致,如NullPointerException(空指针异常)、ArrayIndexOutOfBoundsException(数组越界)、ArithmeticException(算术异常,如除数为 0)。

三、Java异常处理机制

Java 采用 “抛出 - 捕获”(Throw-Catch)机制处理异常,核心逻辑是:当程序发生异常时,先 “抛出” 异常对象,再由对应的代码 “捕获” 并处理,避免程序直接崩溃。

1.抛出异常(Throw)
  • 系统自动抛出:当出现运行时错误(如数组越界),JVM 会自动创建对应异常对象并抛出。
  • 手动抛出:使用throw关键字主动抛出异常对象(如参数校验失败时抛出IllegalArgumentException),格式:throw new 异常类名(异常信息);
2.捕获异常(Catch)

使用try-catch-finally结构捕获并处理抛出的异常,确保程序在异常发生后仍能合理收尾(如释放资源)。

3.声明异常(Throws)

若方法内部无法处理异常,可在方法声明处用throws关键字声明异常类型,将处理责任交给调用者,格式:public 方法名() throws 异常类1, 异常类2 {...}

四、自定义异常

Java 内置异常无法覆盖所有业务场景(如 “年龄必须在 18-60 岁之间”),此时需自定义异常,步骤如下:

1.定义异常类

继承Exception(受检异常)或RuntimeException(非受检异常),添加构造器(通常含 “异常信息” 参数)。

// 自定义受检异常:非法年龄异常
public class IllegalAgeException extends Exception {
    // 无参构造器
    public IllegalAgeException() {}
    // 带异常信息的构造器
    public IllegalAgeException(String message) {
        super(message); // 调用父类构造器传递异常信息
    }
}
2.手动抛出自定义异常

使用throw关键字在业务逻辑中抛出。

public void setAge(int age) throws IllegalAgeException {
    if (age < 18 || age > 60) {
        // 抛出自定义异常
        throw new IllegalAgeException("年龄必须在18-60岁之间,当前为:" + age);
    }
    this.age = age;
}
3.处理自定义异常

通过try-catch捕获,或用throws声明抛出。(try监控,catch捕获)

public static void main(String[] args) {
    try {
        new User().setAge(17);
    } catch (IllegalAgeException e) {
        System.out.println("处理异常:" + e.getMessage()); // 输出异常信息
    }
}

五、总结

异常是 Java 程序运行中的意外情况,其体系以Throwable为核心,分为不可处理的Error和可处理的Exception。Java 通过 “抛出 - 捕获” 机制,结合try-catch-finally结构和throws关键字处理异常,确保程序稳定性。

对于业务特有的异常场景,可通过自定义异常实现更精准的异常管控。合理的异常处理不仅能避免程序崩溃,还能清晰定位问题,提升代码的健壮性和可维护性。

更多推荐