1. 概述

在这个教程中,我们将了解Java中的错误和异常以及它们之间的区别。

2. Throwable

ErrorException 都是Throwable类的子类,用于指示发生了异常情况。此外,只有Throwable及其子类的实例可以在Java虚拟机中抛出或在catch块中捕获。

ErrorException实例被创建来包含有关情况的信息(例如堆栈跟踪):

3. Error

错误表示永远不会发生但异常的情况。当发生严重问题时,会抛出一个错误。此外,错误被视为未检查异常,应用程序不应该尝试捕获和处理它们。而且,错误发生在运行时,无法恢复。

现在让我们看一个例子:

public class ErrorExample {
    
    public static void main(String[] args) {
        throw new AssertionError();
    }

}

如果我们运行上述代码,将得到以下结果:

Exception in thread "main" java.lang.AssertionError:
at com.baeldung.exception.exceptions_vs_errors.ErrorExample.main(ErrorExample.java:6)

代码引发了名为AssertionError的错误,它被抛出以指示断言失败。

Java中的其他错误类型包括StackOverflowErrorLinkageErrorIOErrorVirtualMachineError

4. Exception

异常是应用程序可能希望捕获并处理的不正常情况。异常可以通过try-catch块进行恢复,并且可以在运行时和编译时发生。

异常处理的一些方法包括try-catch块、throws关键字和try-with-resources块。

异常分为两类:运行时异常和检查异常。

4.1. 运行时异常

RuntimeException及其子类是在Java虚拟机运行时可能抛出的异常。它们是未检查异常。如果在方法执行后可以抛出并传播到方法作用域之外,即使未使用throws关键字声明,也可以处理未检查异常。

public class RuntimeExceptionExample {
    public static void main(String[] args) {
        int[] arr = new int[20];

        arr[20] = 20;

        System.out.println(arr[20]);
    }
}

运行以上代码后,我们得到如下输出:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 20
  at com.baeldung.exception.exceptions_vs_errors.RuntimeExceptionExample.main(RuntimeExceptionExample.java:7)

我们可以看到,我们得到了一个ArrayIndexOutOfBoundsException,它是IndexOutOfBoundsException的一个子类,而IndexOutOfBoundsException又是RuntimeException的子类。

RuntimeException的其他子类包括IllegalArgumentExceptionNullPointerExceptionArithmeticException

4.2. 检查异常

不属于RuntimeException的其他异常是检查异常。如果在方法执行后可能抛出并传播到方法作用域之外,需要在方法签名中使用throws关键字声明:

public class CheckedExceptionExcample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream(new File("test.txt"))) {
            fis.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果我们运行上述代码,将得到以下结果:

java.io.FileNotFoundException: test.txt (No such file or directory)
  at java.io.FileInputStream.open0(Native Method)
  at java.io.FileInputStream.open(FileInputStream.java:195)
  at java.io.FileInputStream.<init>(FileInputStream.java:138)
  at com.baeldung.exception.exceptions_vs_errors.CheckedExceptionExcample.main(CheckedExceptionExcample.java:9)

我们得到了一个FileNotFoundException,它是IOException的子类,而IOException又是Exception的子类。

TimeoutExceptionSQLException是检查异常的其他例子。

5. 总结

在这篇文章中,我们学习了Java生态系统中错误和异常的区别。

如往常一样,完整的代码示例可在GitHub上找到。