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 cn.tuyucheng.taketoday.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 cn.tuyucheng.taketoday.exception.exceptions_vs_errors.RuntimeExceptionExample.main(RuntimeExceptionExample.java:7)
正如我们所看到的,我们得到了一个ArrayIndexOutOfBoundsException,它是IndexOutOfBoundsException的子类,它本身是 RuntimeException的子类。
RuntimeException的其他子类包括IllegalArgumentException、NullPointerException和ArithmeticException。
4.2 受检异常
其他不是RuntimeException子类的异常是受检的异常。如果它们可以在方法执行后抛出并传播到方法范围之外,则需要使用throws关键字在方法签名中声明它们:
public class CheckedExceptionExample {
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 cn.tuyucheng.taketoday.exception.exceptions_vs_errors.CheckedExceptionExcample.main(CheckedExceptionExcample.java:9)
我们得到了一个FileNotFoundException,它是IOException的子类,而IOException是Exception的子类。
TimeoutException和SQLException是受检异常的其他示例。
5. 总结
在本文中,我们了解了Java生态系统中错误和异常之间的区别。
与往常一样,本教程的完整源代码可在GitHub上获得。