• 简单聊聊异常体系



    什么是异常,在我们的日常开发中,你或多或少的会遇到各种不同类型的异常,这些都是些什么类型的异常,不知道各位是否有所了解。

    异常就是程序出现了不正常的情况,用来描述代码中出现的问题的,语法错误不是异常体系。

    今天我们就简单的谈谈异常的体系结构

    1.异常的体系结构

    在这里插入图片描述

    我们的异常都派生自Throwable类他有两个子类的实现:

    • error
    • Exception

    error是指程序无法处理的错误,他和程序本身没有关系
    如:

    • NoClassDefFoundError:找不到 class 定义异常
    • StackOverflowError:深递归导致栈被耗尽而抛出的异常
    • OutOfMemoryError:内存溢出异常

    exception是指程序运行的时候他需要处理的异常

    而exception又分为两种,分别是:编译时异常和运行时异常,值得我们注意的是这两个异常还有另外的名字,即受检异常和非受检异常。

    编译时异常(又称为受检异常)

    指在编译阶段必须要主动捕获的异常

    • 除了RuntimeException类及其子类之外的所有异常
    • 必须显示处理,否则程序就会发生错误,无法通过编译

    对于编译时异常,遇到该异常他有两种处理办法:

    • 通过try catch捕获
    • 或者通过throw把异常抛出

    常见的受检异常有:
    如:

    • ClassNotFoundException:找不到指定 class 的异常
    • IOException:IO 操作异常
    • FileNotFoundException:文件不存在异常
    • SQLException:SQL语句异常
    • InterruptedException: (中断异常-调用线程睡眠时候)

    运行时异常(非受检异常)

    非受检异常是指程序不需要主动捕获,一般发生在程序运行期间,比如:Nullpointexception,当然我们可以选择去主动捕获这些异常

    • RuntimeException类及其子类
    • 无需显示处理,也可以和编译时异常一样处理

    如:

    • Nullpointer Exception:空指针异常;
    • ClassCastException:类型强制转换异常
    • IllegalArgumentException:传递非法参数异常
    • IndexOutOfBoundsException:下标越界异常
    • NumberFormatException:数字格式异常
    • ArrayIndexOutOfBoundsException: 数组越界异常
    • ArrayStoreException: 数据存储异常,操作数组时类型不一致
    • ArithmeticException: (算术异常)
    • BufferOverflowException: (缓冲区溢出异常)

    2.异常的处理方式

    2.1 JVM默认处理异常的方式:

    JVM默认处理的两个步骤:

    • 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
    • 程序停止执行

    2.2 throws方式处理异常:

    格式如下:

     public void 方法() throws 异常类名 {...}
    
    • 1
    • 编译时异常必须要进行处理,两种处理方案:try…catch …或者 throws,如果采用 throws 这种方案,在方法上进行显示声明,将来谁调用这个方法谁处理
    • 运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处

    2.3 throw抛出异常

    格式如下:

    throw new 异常();
    
    • 1

    如:

    throw new RuntimeException("信息有误");
    
    • 1

    这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了

    throws和throw的区别
    在这里插入图片描述

    2.4 try-catch方式处理异常

    格式:

    try {
        可能出现异常的代码;
    } catch(异常类名 变量名) {
        异常的处理代码;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 程序从 try 里面的代码开始执行
    • 出现异常,就会跳转到对应的 catch 里面去执行,执行完毕之后,程序还可以继续往下执行

    如果 try 中没有异常,会把try中的代码全部执行,不会执行catch里面的代码

    如果遇到了异常,跳转到对应的catch语句中,当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码

    如果出现的问题没有捕获,那么异常没有处理, 默认交给虚拟机处理.

    同时有可能出现多个异常,就写多个catch,如果多个异常之间存在子父类关系,那么父类一定要写在下面

    3.Throwable成员方法

    在这里插入图片描述

    4.自定义异常

    当Java中提供的异常不能满足我们的需求时,或者我们需要通过指定异常来触发某些事件时,我们可以自定义异常。

    实现步骤:

    • 定义异常类
    • 写继承关系
    • 提供空参构造
    • 提供带参构造
    public class 异常类名 extends RuntimeException {
        public 异常类名() {
        }public 异常类名 (参数) {
            super(参数);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    计算机毕业设计选题推荐-小说推荐系统-Python项目实战【爬虫+可视化+协同过滤算法】
    lodash已死?Radash库方法介绍及源码解析 —— 异步方法篇
    【Unity-Cinemachine相机】相机跟随之Transposer属性
    C++模板
    Baklib|我的企业是不是需要一个维基页面呢?
    Flink学习笔记(2)——Flink快速上手
    show index 中部分字段的含义
    day23
    Google DataFlow入门与(Pub/Sub-DataFlow-BigQuery解决方案)
    LQ0220 前缀判断【程序填空】
  • 原文地址:https://blog.csdn.net/zhiyikeji/article/details/126862752