授课语音

Java 异常

一、认识异常

在 Java 中,异常是指程序运行时出现的错误状况或非正常行为。异常机制是 Java 提供的一种错误处理方式,可以使得程序在遇到错误时不至于直接终止,而是通过捕获和处理异常,将错误的信息传递并采取相应措施。

1. 常见的异常类型

Java 中异常的主要类型:

  • 检查异常(Checked Exception): 必须通过 try-catchthrows 处理,否则编译不通过。比如 IOException
  • 运行时异常(Unchecked Exception): 是程序的逻辑错误引起的,不强制处理。比如 NullPointerException
  • 错误(Error): 由 JVM 引发,如内存不足、栈溢出等。通常不建议捕获或处理。

二、异常的作用

异常机制的主要作用是增强程序的鲁棒性,使得程序在发生错误时能进行合理的处理而不直接崩溃。通过异常的捕获和处理,可以向用户或开发人员提供详细的错误信息,帮助定位和解决问题。同时,异常还支持程序的逻辑分离,提高代码的可读性。

三、异常的处理方案

Java 提供了多种处理异常的方式,常见的包括:

  • try-catch 语句: 捕获并处理异常。
  • try-catch-finally 语句: 无论异常是否发生,finally 块总会执行,一般用于释放资源。
  • throws 关键字: 用于方法声明,向调用方抛出异常。

四、自定义异常

Java 允许程序员根据业务需求定义自定义异常。通过继承 ExceptionRuntimeException 类,可以创建符合项目需求的异常类型,以便在特定的场景下使用。


代码案例

案例 1:基本异常处理(try-catch)

在这个案例中,我们将演示使用 try-catch 捕获并处理异常的基本方法。

public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            // 故意引发异常:除以零异常
            int result = 10 / 0;
        } catch (ArithmeticException e) {
            // 捕获并处理除零异常
            System.out.println("发生算术异常:不能除以零");
        }
    }
}

解释:

  • 在上述代码中,我们尝试进行除法运算 10 / 0,由于分母为零,Java 会抛出 ArithmeticException 异常。
  • catch 块捕获了此异常,并输出提示信息,避免了程序直接崩溃。

案例 2:使用 try-catch-finally 释放资源

在实际开发中,一些资源(如文件、数据库连接等)需要在使用后及时关闭。finally 块通常用于保证资源的释放,无论是否发生异常。

import java.io.FileInputStream;
import java.io.IOException;

public class FileExceptionDemo {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            // 尝试打开一个文件
            fis = new FileInputStream("example.txt");
            System.out.println("文件已打开");
        } catch (IOException e) {
            // 捕获并处理文件未找到异常
            System.out.println("文件未找到:" + e.getMessage());
        } finally {
            // 在 finally 块中关闭文件资源
            if (fis != null) {
                try {
                    fis.close();
                    System.out.println("文件已关闭");
                } catch (IOException e) {
                    System.out.println("关闭文件时发生异常:" + e.getMessage());
                }
            }
        }
    }
}

解释:

  • try 块中尝试打开一个文件。如果文件不存在,将抛出 IOException
  • finally 块无论异常是否发生,都会执行,用于保证文件资源的关闭。

案例 3:throws 声明异常

throws 关键字用于将异常抛给方法的调用方处理,这样可以将异常处理责任交由更高层的代码来决定。

public class ThrowsExample {
    public static void main(String[] args) {
        try {
            readFile();
        } catch (IOException e) {
            System.out.println("捕获到异常:" + e.getMessage());
        }
    }

    // 声明抛出 IOException
    public static void readFile() throws IOException {
        throw new IOException("读取文件时发生错误");
    }
}

解释:

  • readFile 方法使用 throws 关键字声明 IOException,并在方法内抛出此异常。
  • main 方法调用 readFile 时捕获并处理该异常。

案例 4:自定义异常

自定义异常可以更精确地描述业务逻辑中的异常场景,下面是一个余额不足异常的案例。

// 自定义异常类
class InsufficientBalanceException extends Exception {
    public InsufficientBalanceException(String message) {
        super(message);
    }
}

public class CustomExceptionDemo {
    private double balance;

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

    // 取款方法
    public void withdraw(double amount) throws InsufficientBalanceException {
        if (amount > balance) {
            // 如果取款金额超过余额,抛出自定义异常
            throw new InsufficientBalanceException("余额不足,无法取款");
        }
        balance -= amount;
        System.out.println("取款成功,余额:" + balance);
    }

    public static void main(String[] args) {
        CustomExceptionDemo account = new CustomExceptionDemo(1000);
        try {
            // 尝试取款 1500,触发自定义异常
            account.withdraw(1500);
        } catch (InsufficientBalanceException e) {
            // 捕获并处理自定义异常
            System.out.println("操作失败:" + e.getMessage());
        }
    }
}

解释:

  • 自定义异常 InsufficientBalanceException 继承自 Exception,用于表示取款余额不足的异常。
  • withdraw 方法在余额不足时抛出此自定义异常,并在 main 方法中捕获处理。

异常的最佳实践

在使用异常时,遵循一些最佳实践可以让代码更加健壮、清晰。

  • 避免过度使用异常:不要使用异常来控制程序的正常逻辑。
  • 只捕获需要的异常:捕获合适的异常类型,而不是使用 Exception 捕获所有异常。
  • 提供有意义的异常信息:在抛出异常时,提供清晰的错误信息,便于调试和排查问题。

总结

Java 的异常处理机制提供了强大的错误处理能力,使得代码在遇到异常情况时能够继续执行或给予用户合理的提示。在实际开发中,通过合适的异常捕获和自定义异常的使用,可以提高代码的可读性和可靠性。

去1:1私密咨询

系列课程: