201. Java 异常 - 如何抛出异常

201. Java 异常 - 如何抛出异常

在 Java 中,抛出异常是一个核心概念。无论是你的代码、第三方包的代码,还是 Java 平台本身,任何地方都可以抛出异常。了解如何使用 throw 语句抛出异常,并理解异常类的继承体系,是编写健壮程序的关键。


🧐 何时抛出异常?

抛出异常是指在程序执行过程中遇到错误时,通过 throw 语句主动抛出一个异常,告知程序出现了无法继续正常执行的问题。

Java 中的异常体系非常丰富,所有异常类都继承自 Throwable 类,Java 为不同类型的异常提供了不同的类,以便程序可以根据异常类型采取适当的处理措施。


🧩 Java 异常体系

Java 平台提供了许多预定义的异常类。所有这些异常类都继承自 Throwable 类。Throwable 有两个主要的子类:

  1. Error 类 :表示严重的错误,通常是系统层面的问题,例如 OutOfMemoryError。这些错误一般不应该被程序捕获和处理。
  2. Exception 类 :表示程序中的各种异常情况。Exception 又分为两类:
    • 检查异常(Checked Exceptions) :这些异常在编译时必须被处理,程序员必须捕获或声明抛出。例如,IOException、SQLException。
    • 非检查异常(Unchecked Exceptions) :也叫运行时异常,这些异常通常是由于程序中的逻辑错误引起的。程序员可以选择捕获或忽略它们。例如,NullPointerException、ArrayIndexOutOfBoundsException。

🔨 使用 throw 抛出异常

当你的代码检测到错误或不正常的情况时,你可以使用 throw 语句抛出一个异常。

示例:抛出 IllegalArgumentException
java 复制代码
public class Calculator {
    public int divide(int a, int b) {
        if (b == 0) {
            throw new IllegalArgumentException("Division by zero is not allowed!");
        }
        return a / b;
    }
}

在上面的例子中,我们使用 throw 语句抛出了一个 IllegalArgumentException,当除数 b 为零时,我们明确地提示这个错误信息。调用 divide 方法时,如果传入 0 作为除数,就会抛出异常。

如何捕获这个异常:
java 复制代码
public class TestCalculator {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        try {
            System.out.println(calculator.divide(10, 0));
        } catch (IllegalArgumentException e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

在这个例子中,我们捕获了 IllegalArgumentException,并打印出了异常信息。


🛠️ 创建自定义异常类

有时候,Java 自带的异常类不足以表达你的业务逻辑问题。在这种情况下,你可以创建自己的异常类。这对于开发自己的类库或 API非常重要,用户通过这些自定义异常可以明确地区分不同类型的错误。

示例:自定义 InsufficientFundsException
java 复制代码
public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

在上面的例子中,我们创建了一个名为 InsufficientFundsException 的自定义异常类,继承自 Exception。这个异常可以用来表示余额不足的情况。

使用自定义异常:
java 复制代码
public class BankAccount {
    private double balance;

    public BankAccount(double balance) {
        this.balance = balance;
    }

    public void withdraw(double amount) throws InsufficientFundsException {
        if (amount > balance) {
            throw new InsufficientFundsException("Insufficient funds for this withdrawal.");
        }
        balance -= amount;
    }
}

在上面的代码中,withdraw 方法如果遇到余额不足的情况,将抛出我们自定义的 InsufficientFundsException。


🔗 链式异常(Chained Exceptions)

有时在处理异常时,可能会发生一种情况:一个异常被捕获后,你需要抛出另一个异常。为此,Java 提供了链式异常机制,使你能够将一个异常"包装"成另一个异常,以便将原始的异常信息传递给上层调用者。

示例:链式异常
java 复制代码
public class Example {
    public void methodA() {
        try {
            methodB();
        } catch (IOException e) {
            throw new RuntimeException("Runtime exception occurred while handling I/O", e);
        }
    }

    public void methodB() throws IOException {
        throw new IOException("File not found");
    }
}

在上面的例子中,methodA 捕获了 IOException 并将其包装为 RuntimeException,抛给调用者。这里,原始的 IOException 被作为参数传递给新的异常构造函数,形成了一个"链式异常"。


📝 总结

  1. 抛出异常 :使用 throw 语句抛出异常,通常用于捕获无法继续执行的错误情况。
  2. 异常类的继承体系 :Java 提供了丰富的异常类供我们使用,所有异常类都继承自 Throwable。
  3. 自定义异常:你可以创建自己的异常类,帮助你在应用程序中传递特定的错误信息。
  4. 链式异常:链式异常允许你将一个异常"包装"成另一个异常,并保留原始异常的信息。

通过掌握如何抛出异常,学员能够更好地控制错误处理流程,确保程序在遇到问题时能够以合适的方式进行反馈和处理。

相关推荐
明月_清风22 分钟前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
蜗牛互联网1 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
Csvn1 小时前
框架性能优化
前端
回眸&啤酒鸭3 小时前
【回眸】OpenSwarm 多智能体协作系统实战指南
大数据·前端·人工智能
用户69371750013843 小时前
2026,程序员的时代拐点到了
android·前端·后端
大龄秃头程序员3 小时前
一次 iBeacon + BLE 无感解锁方案的实现记录
前端
惜鸟3 小时前
从源码看 pi 的上下文管理:原始数据永久保留,模型视角按需裁剪
后端
小兔子3 小时前
Python 的 GIL 与 free-threading:3.13 之后「去 GIL」走到哪一步了
前端
量化分析码农3 小时前
【Python量化策略评估体系 #05】极端行情扛得住吗?2008/2015/2020 三场景压力测试
后端
十年Java程序媛3 小时前
Java 接口和抽象类对比|Java8 新特性,抛弃老旧八股,正确选型
java·spring boot·后端