1. 概述
在这个教程中,我们将了解Java中的错误和异常以及它们之间的区别。
2. Throwable
类
Error
和 Exception
都是Throwable
类的子类,用于指示发生了异常情况。此外,只有Throwable
及其子类的实例可以在Java虚拟机中抛出或在catch
块中捕获。
Error
和Exception
实例被创建来包含有关情况的信息(例如堆栈跟踪):
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中的其他错误类型包括StackOverflowError
、LinkageError
、IOError
和VirtualMachineError
。
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
的其他子类包括IllegalArgumentException
、NullPointerException
和ArithmeticException
。
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
的子类。
TimeoutException
和SQLException
是检查异常的其他例子。
5. 总结
在这篇文章中,我们学习了Java生态系统中错误和异常的区别。
如往常一样,完整的代码示例可在GitHub上找到。