Java基础:Java异常机制

2022-12-02 08:22:38 浏览数 (1)

异常是程序运行过程中出现的错误。Java 把异常当作对象来处理,把异常信息封装成了一个类,并定义一个基类java.lang.Throwable作为所有异常的超类。Throwable : 它是所有错误与异常的超类(祖宗类),有两个子类 ErrorException。 ~ 本篇主要记录内容包括:异常介绍、抛出异常、声明异常、捕获异常


  • 上一篇内容:Java基础:Java抽象接口
  • 下一篇内容:Java集合:概述
  • 更多知识学习:全网最全的 Java 技术栈内容梳理(持续更新中)

文章目录

代码语言:txt复制
- [一、异常介绍](https://cloud.tencent.com/developer)
        - [1、异常继承体系](https://cloud.tencent.com/developer)
        - [2、运行时期异常&编译时异常](https://cloud.tencent.com/developer)
        - [3、发生异常到时候,程序的执行特征](https://cloud.tencent.com/developer)
        - [4、异常与错误的区别](https://cloud.tencent.com/developer)
        - [5、异常在方法重写中细节](https://cloud.tencent.com/developer)
- [二、抛出异常、声明异常](https://cloud.tencent.com/developer)
        - [1、抛出异常 throw](https://cloud.tencent.com/developer)
        - [2、声明异常 throws](https://cloud.tencent.com/developer)
        - [3、自定义异常](https://cloud.tencent.com/developer)
        - [4、Throwable类中的常用方法](https://cloud.tencent.com/developer)
- [三、捕获异常](https://cloud.tencent.com/developer)
        - [1、try…catch…finally](https://cloud.tencent.com/developer)
        - [2、异常处理流程](https://cloud.tencent.com/developer)
        - [3、try…catch…finally 异常处理的组合方式](https://cloud.tencent.com/developer)

一、异常介绍

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

格式:

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

三、捕获异常

1、try…catch…finally

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

捕获异常格式:

代码语言:javascript复制
try {
    //需要被检测的语句。
}
catch(异常类 e) { //try中抛出的是什么异常,在括号中就定义什么异常类型。
    //异常的处理语句。
}
finally {
    //一定会被执行的语句。
}
//try:该代码块中编写可能产生异常的代码。
//catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
//finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。
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只为关闭资源

0 人点赞