• Java基础:Java异常机制


    异常是程序运行过程中出现的错误。Java 把异常当作对象来处理,把异常信息封装成了一个类,并定义一个基类java.lang.Throwable作为所有异常的超类。Throwable : 它是所有错误与异常的超类(祖宗类),有两个子类 ErrorException

    本篇主要记录内容包括:异常介绍、抛出异常、声明异常、捕获异常




    一、异常介绍

    1、异常继承体系

    异常是程序运行过程中出现的错误。Java 把异常当作对象来处理,把异常信息封装成了一个类,并定义一个基类java.lang.Throwable作为所有异常的超类

    • Throwable : 它是所有错误与异常的超类(祖宗类),有两个子类ErrorException
    • Error : 错误,程序无法处理的错误,比如OutOfMemoryErrorThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
    • Exception : 异常,程序本身可以处理的异常,程序中应当尽可能去处理这些异常。
      • RuntimeException : 运行期异常,JAVA程序运行过程中出现的问题,可以通过java虚拟机来自行处理
      • CheckableException : 编译时异常或者可检查异常,我们应该捕获或者抛出,try…catch。
    2、运行时期异常&编译时异常
    • 运行时期异常:方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常,运行时期异常一旦发生,需要程序人员修改源代码;
    • 编译时异常: 必须在编译前处理,否则无法通过编译
    3、发生异常到时候,程序的执行特征
    1. 我们的代码,从发生异常的地方,开始被一分为二
    2. 在异常发生之前的代码,都可以正常运行,之后的代码不会执行
    3. 当异常发生的时候,这个异常被jvm所捕获,并将这个异常的所有相关信息,创建为一个异常对象,然后将该异常对象的信息输出到控制台(执行的是虚拟机默认的异常处理代码)
    4. 终止当前程序
    4、异常与错误的区别
    • 异常:指程序在编译、运行期间发生了某种异常(XxxException),我们可以对异常进行具体的处理。若不处理异常,程序将会结束运行。
    • 错误:指程序在运行期间发生了某种错误(XxxErrorError错误通常没有具体的处理方式,程序将会结束运行。Error错误的发生往往都是系统级别的问题,都是jvm所在系统发生并反馈给jvm的。我们无法针对处理,只能修正代码。
    5、异常在方法重写中细节
    • 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明;
    • 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集

    二、抛出异常、声明异常

    1、抛出异常 throw

    在 java 中,提供了一个throw关键字,它用来抛出一个指定的(Throwable类型)异常对象,一般会用于程序出现某种逻辑时,程序员主动抛出某种特定类型的异常

    使用格式:throw new 异常类名(参数);

    具体步骤:

    • 创建一个异常对象, 封装一些提示信息(信息可以自己编写).
    • 通过关键字throw,将这个异常对象告知给调用者.
    • throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行

    注意事项:

    • 如果抛出的异常对象属于可检查的异常,必须在该方法头部,声明抛出此异常, 即: throws 要抛出的异常类型;
    • 其次,对于抛出可检查的异常,还必须与方法的异常列表中的异常兼容;
    • 如果父类方法声明了异常列表:子类可以不声明异常列表,子类方法有自己异常列表时,必须保证,子类的异常列表所包含的异常类型,与父类中所包含的异常类型兼容
    2、声明异常 throws

    将问题标识出来,报告给调用者

    throws是方法可能抛出异常的声明, 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws 关键字进行声明。

    对于声明了会抛出可检查异常的方法, 就意味着这个方法会产生可检查异常,所以,一旦调用该方法就必须对该方法做异常处理

    throws后面可以写多个异常类,用逗号隔开

    声明异常格式:修饰符 返回值类型 方法名(参数) throws <异常列表> { }

    3、自定义异常

    如果Java没有提供你需要的异常,则可以自定义异常类

    编译时异常继承Exception,运行时异常继承RuntimeException

    格式:

    Class 异常名 extends Exception{ //或继承RuntimeException
        public 异常名(){
        }
        public 异常名(String s){
            super(s);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    4、Throwable类中的常用方法
    • getCause():返回抛出异常的原因,即异常提示信息。如果 cause 不存在或未知,则返回 null;
    • getMessage():返回异常的消息信息,即该异常的名称与详细信息字符串;
    • printStackTrace():在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置

    三、捕获异常

    1、try…catch…finally

    Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理

    捕获异常格式:

    try {
        //需要被检测的语句。
    }
    catch(异常类 e) { //try中抛出的是什么异常,在括号中就定义什么异常类型。
        //异常的处理语句。
    }
    finally {
        //一定会被执行的语句。
    }
    //try:该代码块中编写可能产生异常的代码。
    //catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
    //finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    2、异常处理流程
    1. 首先,当异常在try*代码块中发生的时候,虚拟机首先捕获这个异常,创建一个异常对象(包含本次异常的所有详细信息);
    2. 虚拟机会把这个异常,抛出给catch代码块(类似于方法调用,虚拟机会调用catch代码块中,处理异常的代码);
    3. 执行catch代码块,中的处理异常的代码;
    4. 没有终止我们应用程序,而是从catch语句之后的代码开始,继续执行我们的应用程序
    3、try…catch…finally 异常处理的组合方式
    • try catch finally组合: 检测异常,并传递给catch 处理,并在finally中进行资源释放;
    • try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理;
    • 多个try catch组合 当可能有多种类型的异常发生的时候,我把可能产生某异常类型的代码分开,分别放在不同的try-catch代码块中;
    • 一个try多个catch组合: 对代码进行异常检测,并对检测的异常传递给catch处理,对每种异常信息进行不同的捕获处理;
    • try finally组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出,异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所以finally只为关闭资源
  • 相关阅读:
    【OpenCV 例程300篇】250. 梯度算子的传递函数
    下载node-sass
    【博客465】BGP(边界网关协议)-----BGP路由黑洞及路由反射器与联盟
    对象与面板链接画线功能
    pytest + yaml 框架 -58.运行报告总结summary.json
    【LeetCode】不同的子序列 II [H](动态规划)
    OPENWRT本地局域网模拟域名多IP
    java项目之高校奖学金管理系统(ssm框架+源码+文档)
    Git常用命令
    LAL v0.34.3发布,G711音频来了,Web UI也来了
  • 原文地址:https://blog.csdn.net/weixin_45187434/article/details/127908675