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

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

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


🧐 何时抛出异常?

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

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


🧩 Java 异常体系

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

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

🔨 使用 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. 链式异常:链式异常允许你将一个异常"包装"成另一个异常,并保留原始异常的信息。

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

相关推荐
前端搞毛开发工程师2 小时前
Ubuntu 系统 Docker 安装避坑指南
前端·后端
猪哥帅过吴彦祖2 小时前
Flutter 系列教程:布局基础 (下) - Stack 绝对定位和 Expanded 弹性布局
前端·flutter·ios
伊织code2 小时前
Uvicorn - Python ASGI Web 服务器
服务器·前端·python·uvicorn·asgi
心月狐的流火号2 小时前
Go语言错误处理
后端·go
SimonKing3 小时前
弃用html2canvas!新一代截图神器snapdom要快800倍
java·后端·程序员
Mintopia3 小时前
🌍 cesium-kit —— 快速实现动态标点与交互的 Cesium 工具库
前端·three.js·cesium
shark_chili3 小时前
IntelliJ IDEA 2025 设置与快捷键完整指南
后端
Mike_jia3 小时前
RustFS:国产高性能对象存储新标杆,全面替代MinIO的优雅方案
前端
2301_781392523 小时前
提高前端开发效率的利器:VUE常用组件及应用
前端·javascript·vue.js