🗒️java异常处理
Mar 27, 2024
| Apr 4, 2024
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password

异常体系结构

在Java的核心类库中,异常处理机制的体系结构基于几个关键类,它们分别是ObjectThrowableErrorException。这个体系结构不仅支持错误的捕获和处理,也是Java语言健壮性特征的一个重要组成部分。
  • Object:位于Java类层次结构的顶部,Object是所有Java类的根类。它提供了一些基本方法,这些方法对所有Java对象都是可用的。虽然Object类本身与异常处理直接相关性不大,但由于Throwable类继承自Object,因此它是整个异常体系结构的基础。
  • Throwable:是Java中所有错误和异常的超类。Throwable确保只有那些继承自它的类型才能被Java虚拟机(JVM)抛出和捕获。它有两个主要的子类:ErrorException,它们分别代表了不同类型的异常情况。
  • ErrorError继承自Throwable,是系统中的错误,是程序员不能改变的和处理的,一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。因此我们编写程序时不需要关心这类错误。
  • Exception:也是继承自Throwable的另一个分支,也就是我们经常见到的一些异常情况,表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。Exception进一步细分为两类:受检异常(Checked Exceptions)和非受检异常(Unchecked Exceptions,或运行时异常)。
notion image

运行时异常与非运行时异常

一是遇到错误就终止程序的运行。另一种方法是程序员在编写程序时,就充分考虑到各种可能发生的异常和错误,极力预防和避免。实在无法避免的,要编写相应的代码进行异常的检测、以及异常的处理,保证代码的健壮性,也就是保证代码可以继续运行下去。
在Java中,异常分为两大类:运行时异常和非运行时异常。
运行时异常(RuntimeException)继承自RuntimeException类,它是Exception的一个子类。这类异常包括但不限于:NullPointerExceptionArrayIndexOutOfBoundsExceptionArithmeticException
  • 它们通常是由程序的错误造成的,如逻辑错误或错误的算法使用。
  • 运行时异常是非受检异常(Unchecked),指那些在编译时不强制要求显式处理的异常。非受检异常通常指示编程错误,如逻辑错误、错误的类型转换等。这类异常的发生通常可以通过更好的编程习惯和逻辑检查来避免。
  • 运行时异常和其子类可以在编程时被忽略,不强制通过try-catch捕获或用throws声明抛出。
非运行时异常(Compiletime Exception/Checked Exception)是指除了RuntimeException及其子类之外的异常。继承自Exception类。这类异常包括但不限于:IOExceptionSQLException
  • 它们通常由外部错误引起,如尝试读取不存在的文件或网络问题。
  • 非运行时异常是受检异常(Checked),指那些在编译时期就必须处理的异常。如果一个方法可能抛出受检异常,那么这个方法必须要么捕获这个异常,要么声明抛出。受检异常的设计意图是强制程序员在编写程序时就考虑到异常情况,从而提高程序的健壮性。
  • 处理这类异常的方式通常是使用try-catch语句块捕获异常,或者在方法签名中使用throws关键字声明该方法可能抛出的异常。
注意:在Java语言中,java.lang包是Java程序的基础,包含了Java语言的核心类,如String、Math、跟随系统、Thread等。这个包被设计为自动导入到所有Java程序中,因此,当你使用这个包中的类和接口时,不需要使用import语句手动导入。这是为了简化常用类和接口的使用,减少编码时的冗余。也就是说,对于Object、Throwable和Exception,通常不需要手动导入,除非你正在创建继承自这些类的自定义类并需要访问它们的特定功能或构造函数。

处理异常的关键字

notion image
  1. trytry 代码块用于包围可能会出现异常的代码。如果在 try 代码块中发生了异常,那么异常会被抛出,try 代码块之后可以跟随一个或多个 catch 块,或者至少一个 finally 块。
  1. catchcatch 代码块用于捕获和处理 try 代码块中发生的特定类型的异常。catch 块必须紧跟在 try 块或其他 catch 块之后。你可以有多个 catch 块来处理不同类型的异常。
      • 使用 trycatch 来捕获系统自动抛出的异常
  1. throwthrow 关键字用于手动抛出一个异常。你可以抛出任何继承自 Throwable 类的实例。抛出的异常可以是新实例化的,也可以是在 try 代码块中捕获的异常。
    1. 在Java中,throw 关键字的“手动”抛出异常是相对于程序在运行时由Java虚拟机(JVM)自动抛出的异常而言的。当程序执行过程中出现错误情况时,如果没有通过代码显式地使用 throw 抛出异常,Java运行时环境会自动检测到错误并抛出相应的异常。这时,开发者可以使用 try-catch 机制来捕获和处理这些由系统自动抛出的异常。
      • 使用throw 来手动抛出异常
  1. throwsthrows 用来声明一个方法可能会抛出的异常类型(也就是声明异常)。调用这样的方法时,必须处理这些异常,要么用 trycatch 捕获,要么在当前方法上继续声明 throws
    1. finallyfinally 关键字在Java异常处理中扮演着特殊的角色。它用于创建一个代码块,该代码块无论是否捕获到异常,都会执行。通常,finally 代码块用于关闭文件、释放资源或进行其他清理工作,这些工作是必须执行的,无论方法执行过程中是否发生了异常。

      追根溯源

      Exception类的直接已知子类(83个):
      notion image
      众所周知学习java最好的资源是Java标准库文档,你可以在其中找到官方规定的Java语言规范、Java标准库API、Java虚拟机规范。
      对于Exception类的更多技术细节,可以在Java标准库API(Java™ Platform, Standard Edition 8 API Specification)中找到。Java API文档是一个动态更新的资源,随着Java版本的升级,可能会添加新的异常类或修改现有的异常定义。因此,建议查阅与您当前使用的Java版本相匹配的官方文档。
      在Java API文档中,java.lang 包下的 Throwable 类是所有错误和异常的超类。从 Throwable 类继承的两个主要子类是 ErrorExceptionError 类表示编译时和系统错误,而 Exception 类则包含了可以被程序捕获和处理的异常。

      常见异常子类

      notion image
      1. NullPointerException (空指针异常类)
          • 例子:假设你有一个代表书籍的对象,你想读取这本书的标题,但是这本书的对象实际上是null。当你尝试访问这本不存在的书的标题时,就会发生空指针异常。
      1. ArrayIndexOutOfBoundsException (数组下标越界异常)
          • 例子:想象你有一个装有五个苹果的篮子(用数组表示),你尝试拿篮子里的第六个苹果时,因为实际上只有五个苹果,所以会抛出数组下标越界异常。
      1. IOException (输入输出异常)
          • 例子:当你尝试通过计算机程序打开一个文件进行读写操作,但是这个文件因为某些原因(如不存在或者没有读写权限)无法被访问时,就会发生输入输出异常。
      1. ArithmeticException (算术异常类)
          • 例子:如果你在计算器程序中尝试将一个数字除以零,这显然是不合逻辑的操作,因此程序会抛出算术异常。
      1. NumberFormatException (字符串转换为数字异常)
          • 例子:假设你有一个文本字段让用户输入年龄,用户输入了“二十三”这个字符串,而你的程序尝试将这个字符串转换为数字时,就会发生字符串转换为数字异常,因为“二十三”不是一个有效的数字格式。
      1. ClassCastException (类型强制转换异常)
          • 例子:设想一个宠物店里有猫和狗,你想把一个标记为宠物的动物转换为猫类型,但这个实际上是一只狗。尝试这样的强制类型转换会引发类型强制转换异常。
      1. FileNotFoundException (文件未找到异常)
          • 例子:当你尝试打开一个特定的文档或图片,但是该文件已经被删除或者路径错误时,你的程序会尝试访问一个不存在的文件,从而抛出文件未找到异常。

      扩展阅读

    2. java
    3. java basics
    4. 数值处理: Math、Biginteger、 BigDecimal重写toString()
      Catalog