本文详细讲解Java异常机制核心知识点,涵盖异常体系结构、处理方式(try-catch-finally、throws)、自定义异常、throw与throws区别、常见运行时异常。

一、异常概述

异常是程序在运行过程中出现的错误或不正常情况,会中断程序的正常执行流程。
Java采用异常处理机制,让程序出现问题时可以优雅处理,而不是直接崩溃。

二、异常体系结构

所有异常的根类:java.lang.Throwable

两大子类:

  1. Error(错误)

    • 系统级别、JVM级别的严重问题
    • 程序无法处理,如:StackOverflowError、OutOfMemoryError
    • 无需捕获处理
  2. Exception(异常)

    • 程序可以捕获和处理的问题
    • 分为编译时异常运行时异常

1. 编译时异常(受检异常)

  • 必须在编译阶段处理,否则代码无法运行
  • 如:IOException、SQLException、ClassNotFoundException

2. 运行时异常(非受检异常)

  • 运行阶段才会抛出,编译不强制检查
  • 如:NullPointerException、IndexOutOfBoundsException、ArithmeticException
  • 一般由代码逻辑错误导致

三、异常处理方式一:try-catch-finally

1. 标准格式

try {
    // 可能出现异常的代码
} catch (异常类型 变量名) {
    // 捕获到异常后执行的处理逻辑
} finally {
    // 无论是否异常,最终都会执行(释放资源常用)
}

2. 代码演示

public class TryCatchDemo {
    public static void main(String[] args) {
        try {
            // 可能出现异常的代码
            int a = 10;
            int b = 0;
            System.out.println(a / b); // 算术异常
        } catch (ArithmeticException e) {
            // 捕获异常并处理
            System.out.println("捕获到算术异常:除数不能为0");
            e.printStackTrace(); // 打印异常堆栈信息
        } finally {
            System.out.println("finally代码块最终一定会执行");
        }
        System.out.println("程序继续向下执行");
    }
}

3. 多catch捕获

try {
    // 代码
} catch (NullPointerException e) {
    // 空指针处理
} catch (IndexOutOfBoundsException e) {
    // 越界处理
} catch (Exception e) {
    // 其他异常
}

四、异常处理方式二:throws 声明抛出

将异常抛给上层调用者处理,自己不处理。

public class ThrowsDemo {
    // 抛出异常,交给调用者处理
    public static void test() throws Exception {
        int a = 10;
        int b = 0;
        System.out.println(a / b);
    }

    public static void main(String[] args) {
        try {
            test();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

五、throw 手动抛出异常

在程序中主动抛出一个异常。

public class ThrowDemo {
    public static void checkAge(int age) {
        if (age < 0 || age > 150) {
            // 手动抛出异常
            throw new IllegalArgumentException("年龄不合法:" + age);
        }
    }
}

六、throw 和 throws 区别

  1. throw

    • 方法内部使用
    • 手动抛出一个异常对象
    • 抛出一个具体异常
  2. throws

    • 方法声明上使用
    • 将异常交给调用者处理
    • 可以声明多个异常

七、自定义异常

  1. 继承Exception(编译时异常)
  2. 继承RuntimeException(运行时异常)
// 自定义年龄非法异常
public class AgeIllegalException extends RuntimeException {
    public AgeIllegalException() {
    }
    public AgeIllegalException(String message) {
        super(message);
    }
}

使用自定义异常

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

八、常见运行时异常

  1. NullPointerException 空指针异常
  2. IndexOutOfBoundsException 索引越界异常
  3. ArithmeticException 算术异常
  4. IllegalArgumentException 参数非法异常
  5. ClassCastException 类型转换异常
  6. NumberFormatException 数字格式转换异常

九、finally 关键字特点

  1. 无论是否发生异常,finally一定执行
  2. 唯一不执行情况:JVM退出(System.exit(0))
  3. 常用于:IO流关闭、数据库连接释放、资源回收

更多推荐