理解 Java 中的异常层次结构

已发表: 2022-03-08

“异常”一词是“异常事件”的缩写。 在Java中,异常本质上是在程序执行过程中发生的一个事件,会破坏程序的正常流程。 异常是不需要的,而且大多是意外的,通常在运行时或编译时出现。 需要处理所有这些异常以确保程序在其自然流程中运行。

但是,在处理异常之前,了解 Java 中存在哪些不同类型的异常会有所帮助。 通过这篇文章,让我们看看Java中的各种异常类型以及它们所遵循的异常层次结构。

目录

Java中的异常层次结构

Java 编程语言中异常的层次结构始于 Throwable 类——它来自 Object 类并且是它的直接子类,而 Exception 类将所有的 Throwable 类进一步分支为两个子类——Error 和 Exception。 这是一个流程图,可以更好地理解 Java 异常层次结构:

Exception 类提供了您在使用 Java 编程语言时可能需要处理的所有异常。 此类异常的一些常见和遇到的示例包括 NullPointerException、ClassNotFoundException、IllegalArgumentException 等。

另一方面,Error 类负责处理 Java 程序体系结构中更严重的问题,而不是在应用程序代码中处理。 Java 中的一些错误示例包括 InternalError、AssertionError、OutOfMemoryError 等。

Java中的异常进一步分为两类:

  • 检查异常——这些也称为编译时异常。
  • 未经检查的异常——这些也称为运行时异常。

此时要注意的重要一点是,未经检查的异常都是 RuntimeException 类的子类。 我们将在本文后面详细讨论已检查和未检查的异常。 但在此之前,让我们从本质上看一下错误和异常在工作中的不同之处,以免造成混淆。

Java 中的错误和异常——它们有何不同?

Java 编程语言的官方文档将错误称为 Java 编程过程中发生的错误——“表明合理的应用程序不应尝试捕获的严重问题”。 错误的严重性从这个陈述的方式就可以清楚地看出。 显然,这是指您的程序可能面临的一系列问题,如果不重构代码或修改 Java 应用程序体系结构,就无法从这些问题中恢复。

让我们看一个会抛出错误的 Java 方法:

公共静态无效打印(字符串 S){

印刷);

}

在上面提到的代码中,方法 print() 充当递归方法,不断地重复调用自身,一遍又一遍,直到达到 Java 中线程堆栈的最大允许大小。 此时,它会以非常常见的 StackOverflowError 退出执行,其内容如下:

线程“main”中的异常 java.lang.StackOverflowError

在 StackOverflowErrorExample.print(StackOverflowErrorExample.java:3)

如上例所示,该方法抛出了一个示例,但代码本身无法处理此错误。 因此,程序只是退出执行,因为损坏是不可恢复的。 作为解决方案,需要修改代码。

与错误相反,异常表示可以被合理的应用程序捕获的条件。 Java 中的异常包括可能在编译时或运行时发生的问题。 这些异常在所有应用程序中都相当频繁地发生——尤其是在测试和调试阶段。 因此,Java 中的异常可以在程序本身内处理,以确保代码运行其自然流程。

现在,让我们通过查看已检查和未检查异常是什么来进一步讨论 Java 中的异常层次结构。

Java 中的已检查和未检查异常

如前所述,Java 程序中的异常可能发生在编译时或运行时。 这就是为我们提供了 Java 中存在的两种广泛类型的异常的原因。 下面详细介绍这两个异常。

编译时异常

在编译时发生的异常称为编译时异常。 这些也称为检查异常,因为您需要在 Java 程序中显式检查它们并在代码本身中处理它们。 InterruptedException、IOException 等类都是检查异常。

让我们看一个可以处理已检查异常的方法:

公共无效 writeAFile() {

尝试 (BufferedWriter b_w = new BufferedWriter(new FileWriter(“myFile.txt”))) {

b_w.write(“测试”);

} 捕捉(IOException ioe){

ioe.printStackTrace();

}

}

如您所见,上述代码的 try 块中有两条语句——

  • 实例化对象——BufferedWriter
  • 使用对象写入文件

这两个语句都可以抛出 IOException。 IOException 是一个 Checked Exception,需要由调用者或方法处理。 在上面的示例中,您可以看到在方法本身内处理的异常。

运行时异常

与编译时抛出的编译时异常相反,运行时或未经检查的异常可以“随时”抛出,这本质上意味着在运行时。 因此,方法不需要显式使用 catch-and-throw 块来处理这些未经检查的异常。 一些继承未经检查的运行时异常的类包括——NullPointerException、ArithmeticException 等。

让我们看一段抛出 NullPointerException unchecked Exception 的 Java 代码,它不像前面那样在这段代码中处理。 这里是:

公共无效 writeToFile() {

尝试(BufferedWriter b_w = null){

b_w.write(“测试”);

} 捕捉(IOException ioe){

ioe.printStackTrace();

}

}

当您调用上述方法时,由于 BufferedWriter 对象为空,程序将抛出 NullPointerException。 以下是异常的内容:

线程“主”java.lang.NullPointerException 中的异常

在 IOExceptionExample.writeToFile(IOExceptionExample.java:10)

在 IOExceptionExample.main(IOExceptionExample.java:17)

综上所述

至此,我们到了这篇关于理解 Java 异常层次结构的博客的结尾。 请记住,这绝不是全面介绍 Java 中的异常以及如何处理它们。 为此,您应该深入挖掘并将自己暴露于不同的可能异常,以了解它们是如何工作的。 了解异常处理将使您成为一名成功的全栈开发人员,因为异常是任何应用程序的基础。

在 upGrad,我们有专门的全栈开发课程 -软件开发执行 PG 计划 - 全栈开发专业化- 我们主要关注全栈开发,带您了解软件开发的所有细微差别。 我们建议您查看课程并可能尽快预订座位!

1. 哪个类出现在 Java 异常层次结构的顶部?

Throwable 类位于 Java 异常层次结构的顶部。

2. Java 中存在哪些不同类型的异常?

Java 有未经检查和检查的异常。 Checked Exceptions 也称为编译时异常,而 Unchecked Exceptions 也称为运行时异常。

3、Java中的异常是如何处理的?

try-catch 是在 Java 中处理异常的最简单方法。 您要运行的主要代码段需要放在 try 块中,而一个或多个 catch 块将捕获代码抛出的所有异常。 此方法将检测抛出的任何类型的 Java 异常。