Exception异常机制详细讲解

目录

  • 一、异常
    • 1.1 什么是异常
    • 1.2 异常机制的作用
    • 1.3 常见的异常
    • 2.3 异常的分类
      • 1. Error
      • 2. Exception
      • ① 运行时异常
      • ② 编译期异常
      • 总结:
  • 二、异常的处理
    • 2.1 抛出异常
    • 3.1 抛出异常语法
    • 3.2 试图捕获异常
    • 3.3 捕获异常与抛出异常的区别
      • 1. 抛出异常
      • 2.捕获异常
  • 三、finally
  • 四、throw 异常的产生(创建)
  • 四、异常类的API
  • 五、自定义异常
    • 最后

一、异常

1.1 什么是异常

  • 异常(exception),就是程序中出现的错误
  • 就好比你在工作的时候,突然家里出了点情况,中断了你工作,这就是出现了异常情况。

1.2 异常机制的作用

  • 通过打印出的异常信息,我们可以知道是哪里的代码出现了问题,并大概了解为什么会出现这个问题,方便我们去解决问题

1.3 常见的异常

  • 算术异常 ArithmeticException

  • 数组下标越界异常 ArrayIndexOutOfBoundsException

  • 空指针异常 NullPointerException

  • 类转换异常ClassCastException

  • 解析异常 ParseException

  • 堆栈内存溢出错误 StackOverflowError

2.3 异常的分类

  • 异常也是一种类,Throwable 类是 Java 语言中所有错误或异常的超类。

1. Error

  • Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。
  • 也就是Error一般都是严重问题,遇到必须里面立马解决,所以不应该捕获…
  • 例如:堆栈内存溢出错误 StackOverflowError

2. Exception

可以抛出,也可以捕获的异常

Exception子类:RuntimeException(运行时异常)和其他异常类

① 运行时异常

  • 这些异常在编译时不强制要求处理,通常是由程序中的错误引起的,例如 NullPointerException、ArrayIndexOutOfBoundsException 等,这类异常可以选择处理,但并非强制要求。

在这里插入图片描述

  • 这些类是: RuntimeException及其子类的都是运行时异常

在这里插入图片描述

② 编译期异常

  • 编译期异常是用户错误或问题引起的异常,这些异常在编译时强制要求程序员处理。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。

在这里插入图片描述

总结:

Throwable
Error
Exception
验证问题,不能捕获,只能抛出
运行时异常
编译期异常
是RuntimeException的子类
默认不用处理
除了RuntimeException的子类的都是
必须强制处理

二、异常的处理

我们知道异常的基本概念了,那异常如何处理呢?

  • 异常的处理只有两种方式

    • 抛出异常
    • 捕获异常

2.1 抛出异常

  • 什么是抛出异常?

    目前为止任何异常,默认的处理方式都是抛出

    所谓抛出异常就是直接将错误信息打印到控制台
    在这里插入图片描述

3.1 抛出异常语法

  • 前面讲到运行时异常,可以不用处理,通过上图也发现系统会默认自动抛出
  • 如果是编译期异常,想要抛出异常,语法是
    • 位置: 在方法参数列表后,{}前
    • 写:throws 异常类名,类名2,…
    public static void main(String[] args) 
        throws ArithmeticException,ArrayIndexOutOfBoundsException {
        
    }
  • 声明抛出异常后,什么效果?
  • 如果代码一切正常,虽然声明的有抛出异常,也不会在控制台打印异常信息
  • 如果代码真的有异常,声明了抛出异常,
    • 1错误信息就会在控制台打印
    • 2抛出异常后,后续代码不再执行
    // 以下代码中19行报错,4,5,6,7.7都不再执行
    public static void main(String[] args) {
        System.out.println(0.0 );
        m1();
        System.out.println(7.7 );
    }


    public static void m1() {
        System.out.println(1);
        System.out.println(2);
        m2();
        System.out.println(5);
        System.out.println(6);
    }

    public static void m2(){
        System.out.println(3);
        System.out.println(4 / 0);
        System.out.println(4 );
    }
  • 但是如果方法抛出的是编译期异常,谁调用这个抛出编译期异常的方法,那么哪个方法就得处理!!

在这里插入图片描述

  • 特殊的 ,关于抛出异常在重写方法时也有要求…
  • 子类的重写后,方法抛出的异常范围要 <= 父类的异常范围
  • 特殊的,如果父类方法没有抛出异常,那么子类方法内有异常也不能抛出,只能捕获

总结抛出异常

  • 哪里抛出的?
    • 方法签名上只是声明可能抛出的异常类型
    • 方法体内,执行到某一行代码,如果有错才会抛出
  • 抛给谁?
    • 如果有异常抛出,谁调用抛给哪个方法
    • 最终抛出到main
    • main方法抛出到jvm,jvm打印到控制台
  • 抛到哪?
    • 抛出到控制台
  • 抛出了啥?
    • 异常的线程信息
    • 异常类型
    • 异常原因
    • 异常位置

3.2 试图捕获异常

试图捕获(try-catch)

  • 语法
try{
    // 可能会有报错的代码
} catch (异常类名 对象名){
    // 如果抓到异常,执行这里
}

执行流程:

  • 代码正常运行,执行try后
  • 进入try执行,如果try内一切正常,catch就跳过不执行
  • 如果try内有异常
    • try内异常处后续不执行
    • catch捕获到异常后,就会执行
  • 无论try内有无异常,try-catch后的代码都能运行
    public static void main(String[] args) {

        System.out.println(1);
        System.out.println(2);

        try {
            System.out.println(3);
            System.out.println(4.1);
            System.out.println(4/0);
            System.out.println(4.2);
        }catch (ArithmeticException ae){
            System.out.println("捕获到了异常:"+ae );
        }

        System.out.println(5);

    }
  • 特殊情况1: 出现的异常和捕获的异常不一致,try-catch失效

在这里插入图片描述

  • 特殊情况2: 允许同时声明catch多个异常

在这里插入图片描述

  • 特殊情况3: 如果真需要catch写多个异常,用于去捕获多种异常的话,建议这么写,写一个Exception,直接捕获最大类异常,这样所有异常子类都可以捕获

image-20240603114043937

3.3 捕获异常与抛出异常的区别

1. 抛出异常

在这里插入图片描述

通过上图发现程序中断,后续代码无法执行

2.捕获异常

在这里插入图片描述

通过上图发现,当try代码块中出现异常后,catch代码块捕获到异常,执行catch中的语句,而且try-catch外面的语句正常执行

三、finally

  • finally配合try-catch使用
  • 作用: 最终一定会执行,即放在finally里面的代码,之前无论有无报错,无论是抛出还是捕获,fianlly里面的代码最终一定能执行

语法:

try{
    // ...
}catch(Exception e){
    
}finally{
    
}

或者

try{
    // ...   
}finally{
    
}

finally一般用在 关闭流/通道的场景中,用于及时释放资源

例如: IO流,jdbc连接

四、throw 异常的产生(创建)

  • 之前说的是抛出异常,捕获异常都是异常出现了之后的解决方案.

如何制造产生异常呢?

产生异常,两个步骤:

  • 创建异常对象
  • 通过throw 抛出异常对象
    • 需要注意,throw抛出的是编译期异常,需要强制处理
    • throw抛出的是运行时异常,可以默认不用处理

public class Demo5 {

    public static void main(String[] args) throws ParseException {
        String s = parseBirthday2("41011120240101123");
        System.out.println(s );
    }

    /**
      需求: 解析身份证号中的生日,要求身份证号长度18位,
      否则抛出异常
     */
    public static String parseBirthday(String idNumber) throws ParseException{
        if (idNumber.length() == 18) {
            return idNumber.substring(6,14);
        }
        // 抛出异常(编译期异常,需要处理)
        throw new ParseException("生日解析出错,格式不正确",1);
    }


    public static String parseBirthday2(String idNumber) {
        if (idNumber.length() == 18) {
            return idNumber.substring(6,14);
        }
        // 抛出异常(运行时异常,不用管)
        throw new RuntimeException("2222生日解析出错,格式不正确");
    }
}
  • 总结throw和throws…
throwthrows
位置方法体内方法签名上
后面写什么跟1个异常对象跟异常类名,且允许多个
作用一定会抛出异常的声明抛出的异常类型,但是不一定有异常

四、异常类的API

查阅API,发现所有异常,方法基本上都直接继承自Throwable类,常用的方法

  • 构造方法 Throwable(String message)
    • 所有的异常对象,都通过有参构造将异常信息传递给Throwable父类
    • 且这个message就是异常信息
  • String getMessage()
  • void printStackTrace()
  • String toString()
public class Demo6 {

    public static void main(String[] args) {
        try {
            System.out.println(1/0 );
        }catch (ArithmeticException ae) {
            // String message = ae.getMessage( );
            // System.out.println("message = " + message);
            //
            // String string = ae.toString( );
            // System.out.println("string = " + string);

            // 获得这些异常信息,将来将其输出到本地磁盘日志文件
            ae.printStackTrace();
        }
    }
}

五、自定义异常

自定义异常实现步骤

  1. 创建一个异常类,命名规范XxxxException
  2. 继承一个合适的父类
    1. 继承编译期异常
    2. 继承运行时异常
  3. 设计一个有参构造,将异常信息参数通过super传递给父类异常

如何使用自定义异常类:

  • 在需要使用的方法内部,通过throw+该异常对象,将其抛出

// 异常类

public class AgeOutOfBoundsException extends Exception{

    public AgeOutOfBoundsException(String msg){
        super(msg);
    }

}

// 使用异常

public class Dog {

    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws Exception{
        if (age <= 0 || age >= 100) {
            throw  new AgeOutOfBoundsException("年龄"+age+"越界!");
        }
        this.age = age;
    }
}

最后

如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

# 全面解剖 消息中间件 RocketMQ-(5)

全面解剖 消息中间件 RocketMQ-&#xff08;5&#xff09; 一、RocketMQ &#xff1a;过滤消息的两种方式 1、Tag 过滤 在大多数情况下&#xff0c;TAG 是一个简单而有用的设计&#xff0c;其可以来选择您想要的消息。 例如: DefaultMoPushconsumer consumer new DefaultM…

新项目来了,JDK 17和JDK 21 该如何选择?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

FPGA Verilog模块化设计入门篇一

随着电子技术的快速发展&#xff0c;现场可编程门阵列&#xff08;FPGA&#xff09;已成为现代电子系统设计中不可或缺的一部分。FPGA的灵活性、可重构性和高性能使得它成为处理复杂算法、加速数据处理和实现特定功能的理想选择。然而&#xff0c;随着系统复杂性的增加&#xf…

抢拍寄售模式:引领行业潮流的新商业引擎

在如今竞争激烈的市场中&#xff0c;企业的成功不仅依赖于产品和服务的质量&#xff0c;更在于能否把握市场趋势&#xff0c;采用创新的商业模式来推动增长。今天&#xff0c;我将详细介绍一种新兴的商业模式——抢拍寄售模式。这种模式以其独特的业务流程和逻辑&#xff0c;正…

让企业自己掌握数据主权,可道云teamOS让企业数据私有化不再是难题,让企业数据更安全、更可控

越来越多的企业开始意识到&#xff0c;仅仅依赖公共云存储服务可能无法满足其对于数据安全性的高标准要求。 毕竟每年都会有不同程度的数据泄露问题爆出&#xff0c;导致大家在使用企业网盘的时候也总是惴惴不安。一旦数据泄露或被非法获取&#xff0c;企业将面临巨大的经济损…

github将默认分支main改为master

github将默认分支main改为master 1.进入github&#xff0c;点击setting 2.在setting中&#xff0c;选择Respositories&#xff0c;更新默认分支为master 3.选择要更新的项目&#xff0c;在项目中选择setting->general->切换默认分支

PPT设置为本框的默认格式以及固定文本框

调整文本框固定位置 双击文本框之后勾选如下三个位置 设置文本框为默认 在调整好文本框的基本性质后&#xff0c;设置为默认即可

【2024PythonPycharm详细安装教程】

1.打开官网 https://www.python.org/ downloads——>Windows 2.找到 Download Windows installer (64-bit) 下载 3.下载完成双击安装包 勾选Add python.exe to PATH(自动配置系统变量) 点击Install Now&#xff08;默认安装&#xff09; 然后看到安装成功&#xff0…

C# 校验Json格式

错误json&#xff1a;错误值 -2146.379 [{"Key": "surface_heights_average","Value": "-2122.739nm","Description": "surface_heights_average"}, {"Key": "surface_heights_max","V…

python语句执行不了

文章目录 问题解决方案小结 问题 执行命令 python install -r .\requirements.txt出现问题如下&#xff1a; D:\soft\Python310\python.exe: cant open file G:\\Area\\C\\Fay\\install: [Errno 2] No such file or directory (.venv) PS G:\Area\C\Fay> pip install -r .…

微软AI PC革命Windows,游戏竟带头开挂

在购物节到来之际&#xff0c;各个厂家都摩拳擦掌&#xff0c;除了手机那边搞得热火朝天&#xff0c;当然电脑这边也没闲着。 微软就趁着 520 这味儿&#xff0c;召开了自己的 Build 2024 开发者大会&#xff0c;同时还发布了最新一代的 Surface Pro 和 Surface Laptop&#xf…

【ROS】mp4转rosbag

前言 工作中遇到域控中无中间件&#xff0c;无法采用rosbag等中间件的形式同时采集感知结果与视频流&#xff0c;只能通过外接摄像头采集视频流&#xff0c;以及使用can报文或者bin文件形式存储路测数据&#xff1b;导致本地回放时&#xff0c;无法通过视频流观察真实情况&…

年刊文量激增破1000+,但3个月即可录用,这本2区TOP SSCI在你的考虑之列吗

【SciencePub学术】今天小编给大家推荐一本经济金融领域的SSCI&#xff0c;JCR1区&#xff0c;中科院2区TOP&#xff0c;影响因子高达10.4&#xff0c;最重要的是审稿周期较短&#xff0c;对急投的学者较为友好&#xff0c;同领域的作者不妨考虑一下这本期刊&#xff01; Finan…

ERPNext - 用Python打造您的企业资源规划解决方案

文章目录 ERPNext - 用Python打造您的企业资源规划解决方案第一部分&#xff1a;背景第二部分&#xff1a;ERPNext是什么&#xff1f;第三部分&#xff1a;如何安装ERPNext&#xff1f;第四部分&#xff1a;ERPNext基本使用方法第五部分&#xff1a;场景应用示例第六部分&#…

STM32高级控制定时器应用之检测输入PWM周期和占空比

目录 概述 1 PWM 输入模式 1.1 原理介绍 1.2 应用实例 1.3 示例时序图 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM占空比函数 3.2 输入捕捉回调函数 4 功能测试 4.1 测试软件框架结构 4.2 实验实现 4.2.1 测试实…

使用element的小弹框并修改css

使用el-popover来做弹框&#xff1a; 滑动或点击元素要加插槽slot"reference"来展示弹框&#xff1b; <el-popoverplacement"top"width"166"trigger"hover"popper-class"popover"><div><div><div>…

关于大模型多轮问答的两种方式

前言 大模型的多轮问答难点就是在于如何精确识别用户最新的提问的真实意图&#xff0c;而在常见的使用大模型进行多轮对话方式中&#xff0c;我接触到的只有两种方式&#xff1a; 一种是简单地直接使用 user 和 assistant 两个角色将一问一答的会话内容喂给大模型&#xff0c…

AIGC笔记--DDIM的简单实现

1--DDIM介绍 原论文&#xff1a;DENOISING DIFFUSION IMPLICIT MODELS 2--核心代码 # ddim的实现 def compute_alpha(beta, t):beta torch.cat([torch.zeros(1).to(beta.device), beta], dim0) # beta -> [1, beta]# 先通过cumprod计算累乘结果&#xff0c;即: alpha_(t)…

微软找腾讯接盘,Windows直接安装手机APP体验起飞了

熟悉微软的同学都知道微软有个传统艺能——什么好用砍什么。 比如 Win10 砍掉了还算方便的小娜&#xff0c;推出 Win11 砍掉了 Win10 上面好用的磁贴功能等。 上一秒用户还在夸奖点赞。 下一秒就给你砍掉&#xff0c;顺带还塞一堆 BUG 给你。 但没办法&#xff0c;PC 近乎垄断…

【WEEK15】 【DAY1】Swagger第四部分【中文版】

2024.6.3 Monday 接上文【WEEK14】 【DAY5】Swagger第三部分【中文版】 目录 16.9.拓展&#xff1a;其他皮肤16.9.1.修改pom.xml16.9.2.重启并分别访问对应的网址16.9.2.1.swagger-ui16.9.2.2.bootstrap-ui16.9.2.3.Layui-ui16.9.2.4.mg-ui 16.9.拓展&#xff1a;其他皮肤 16.…