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

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

相关推荐
Imnobody4 分钟前
吴恩达 Prompt 工程课精讲③:三次迭代,解决 Prompt 的三大致命问题(JupyterLab 实战)
后端
spionbo13 分钟前
Vue 模拟键盘组件封装方法与使用技巧详解
前端
顾青14 分钟前
微信小程序 VisionKit 实战(二):静态图片人脸检测与人像区域提取
前端·微信小程序
hmfy15 分钟前
那些前端老鸟才知道的秘密
前端
野葳蕤15 分钟前
react总览
前端
不一样的少年_18 分钟前
她说想要浪漫,我把浏览器鼠标换成了柴犬,点一下就有烟花(附源码)
前端·javascript·浏览器
顾青19 分钟前
微信小程序实现身份证识别与裁剪(基于 VisionKit)
前端·微信小程序
星链引擎19 分钟前
技术深度聚焦版(侧重技术原理与代码细节)
前端
呵阿咯咯19 分钟前
ueditor富文本编辑器相关问题
前端
月弦笙音19 分钟前
【Vue3】Keep-Alive 深度解析
前端·vue.js·源码阅读