• Java中的异常体系


    异常是指由于各种无法预知的情况,导致程序中断运行的一种指令流,如:文件找不到、非法参数、网络超时等。为了保证程序的正常运行,在设计程序时必须考虑到各种异常情况,并正确的对异常进行处理。异常也是一种对象,Java当中定义了许多异常类,并且定义了基类java.lang.Throwable作为所有异常的超类。Java语言设计者将异常划分为两类:ErrorException 其体系结构大致如下图所示:

    异常体系

    Throwable有两个重要的子类:Exception(异常)和Error(错误),两者都包含了大量的异常处理类:

    • Error(错误):是程序中无法处理的错误,表示运行应用程序中出现了严重的错误,此类错误一般表示代码运行时JVM出现问题。 通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如说当JVM耗完可用内存时,将出现OutOfMemoryError。此类错误发生时,JVM将终止线程。这些错误是不可查的,非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误;
    • Exception(异常):程序本身可以捕获并且可以处理的异常;

    Exception这种异常又分为两类:运行时异常和编译异常

    • 运行时异常(不受检异常):RuntimeException类极其子类表示JVM在运行期间可能出现的错误。 比如说试图使用空值对象的引用(NullPointerException)、数组下标越界(ArrayIndexOutBoundException)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理;
    • 编译异常(受检异常):Exception中除RuntimeException极其子类之外的异常。如果程序中出现此类异常,比如说IOException,必须对该异常进行处理,否则编译不通过。 在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。

    Java应用中,异常的处理机制分为抛出异常和捕获异常:

    • 抛出异常:当一个方法出现错误而引发异常时,该方法会将该异常类型以及异常出现时的程序状态信息封装为异常对象,并交给本应用。运行时,该应用将寻找处理异常的代码并执行。任何代码都可以通过throw关键词抛出异常,比如Java源代码抛出异常、自己编写的代码抛出异常等;
    • 捕获异常:一旦方法抛出异常,系统自动根据该异常对象寻找合适异常处理器(Exception Handler)来处理该异常。所谓合适类型的异常处理器指的是异常对象类型和异常处理器类型一致;

    对于不同的异常,Java采用不同的异常处理方式:

    • 运行异常将由系统自动抛出,应用本身可以选择处理或者忽略该异常;
    • 对于方法中产生的Error,该异常一旦发生JVM将自行处理该异常,因此Java允许应用不抛出此类异常;
    • 对于所有的可查异常,必须进行捕获或者抛出该方法之外交给上层处理。也就是当一个方法存在异常时,要么使用try-catch捕获,要么使用该方法使用throws将该异常抛调用该方法的上层调用者。

    参考

    深入理解Java中异常体系

  • 相关阅读:
    59.【C++迷宫小游戏(超详细,有手就行)】
    【漏洞复现】SQL注入漏洞
    STM32的HAL库SPI操作(master 模式)-根据时序图配置SPI
    BUUCTF [BJDCTF2020]EasySearch 1
    机器学习基础(三)监督学习的进阶探索
    H.迷宫,(算法选修)
    Verilog基础:避免混合使用阻塞和非阻塞赋值
    睿趣科技:现在做抖音网店卖啥好
    Spring Boot 生成二维码
    程序员的 Windows 工具箱「GitHub 热点速览」
  • 原文地址:https://blog.csdn.net/xingyu19911016/article/details/125467598