异常—javaSE

news2024/11/18 3:23:53

文章目录

  • 1.概念和结构体系
    • 1.1概念
    • 1.2结构体系
  • 2.常见异常类型
    • 2.1空指针异常
    • 2.2数组越界异常
    • 2.3算数异常
  • 3.异常的分类
    • 3.1编译时异常
    • 3.2运行时异常
  • 4.异常的处理
    • 4.1防御式编程
    • 4.2异常的抛出
    • 4.3异常的捕获
      • 4.3.1异常申明throws
      • 4.3.2try-catch捕获并处理异常
      • 4.3.3finally
    • 4.4异常的处理流程
  • 5.自定义异常

1.概念和结构体系

1.1概念

java中,将程序执行过程中发生的不正常行为称为异常,java中不同类型的异常,都有与其对应的类来进行描述

1.2结构体系

  1. Throwable:是异常体系的顶层类,其派生出两个的子类,Error 和 Exception
  2. Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError
  3. Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行,我们平时所说的异常就是Exception

2.常见异常类型

2.1空指针异常

public class TextDame {
    public static void main(String[] args) {
        int[] array = null;
        System.out.println(array.length);
    }
}

在这里插入图片描述

2.2数组越界异常

public class TextDame {
    public static void main(String[] args) {
        int[] array = {1,2,3,4};
        System.out.println(array[10]);
    }
}

在这里插入图片描述

2.3算数异常

public class TextDame {
    public static void main(String[] args) {
        int a = 10 / 0;
        System.out.println(a);
    }
}

在这里插入图片描述

3.异常的分类

3.1编译时异常

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常,ClassNotFoundException和CloneNotSupportedException以及IOException及其子类都是编译时异常

3.2运行时异常

在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常,RunTimeException以及其子类对应的异常,都称为运行时异常

4.异常的处理

4.1防御式编程

(1)事前防御型:在操作之前就做充分的检查,使用大量的if else语句进行判断,缺点是正常流程和错误处理流程代码混在一起,代码整体显的比较混乱
(2)事后认错型:使用try catch语句,优点是正常流程和错误流程是分离开的, 程序员更关注正常流程,代码更清晰,容易理解代码,异常处理主要的5个关键字:throw、try、catch、final、throws

4.2异常的抛出

借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者
注意:

  1. throw必须写在方法体内部
  2. 抛出的对象必须是Exception 或者 Exception 的子类对象
  3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
  4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译
  5. 异常一旦抛出,其后的代码就不会执行
public class TextDame {
    public static void main(String[] args) {
        int[] array = null;
        try {
            if (array == null){
                throw new NullPointerException("空指针异常");
            }
        }catch (NullPointerException e){
            System.out.println("捕获到空指针异常");
        }
    }
}

4.3异常的捕获

4.3.1异常申明throws

在方法声明时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常,此时就可以借助throws将异常抛给方法的调用者来处理
注意:

  1. throws必须跟在方法的参数列表之后
  2. 声明的异常必须是 Exception 或者 Exception 的子类
  3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型具有父子关系,直接声明父类即可
  4. 调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出
class Person implements Cloneable {
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class TextDame {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person = new Person();
        Person person1 = (Person) person.clone();
    }
}

4.3.2try-catch捕获并处理异常

throws对异常并没有真正处理,而是将异常报告给抛出异常方法的调用者,由调用者处理。如果真正要对异常进行处理,就需要try-catch

语法格式:
try{
// 存放可能出现异常的代码
}catch(要捕获的异常类型 e){
// 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的父类时,就会被捕获到,对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
}finally{
// 此处代码一定会被执行到
}

public class TextDame {
    public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array.length);
        }catch (NullPointerException e){
            System.out.println("捕获到空指针异常");
        }
    }
}

注意:

  1. try块内抛出异常位置之后的代码将不会被执行
  2. 如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到JVM收到后中断程序,因为异常是按照类型来捕获的
public class TextDame {
    public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array.length);
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("捕获到空指针异常");
        }
    }
}

在这里插入图片描述

  1. try中可能会抛出多个不同的异常对象,则必须用多个catch来捕获,且前一个异常的类型范围必须小于等于后一个异常
  2. 可以通过一个catch捕获所有的异常,即多个异常,一次捕获,但是不推荐,因为可读性差且不知道捕捉到的到底是什么异常,catch 进行类型匹配的时候, 不光会匹配相同类型的异常对象,也会捕捉目标异常类型的子类对象

4.3.3finally

(1)在写程序时,有些特定的代码,不论程序是否发生异常,都需要执行,比如资源回收,因为异常会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的,finally中的代码一定会执行的
(2)finally 执行的时机是在方法返回之前(try 或者 catch 中如果有 return 会在这个 return 之前执行 finally),但是如果finally 中也存在 return 语句,那么就会执行 finally 中的 return, 从而不会执行到try中原有的 return

4.4异常的处理流程

(1)如果本方法中没有合适的处理异常的方式,就会沿着调用栈向上传递
(2)如果向上一直传递都没有合适的方法处理异常,最终就会交给 JVM 处理,程序就会异常终止,和我们最开始未使用 try catch 时是一样的
总结:

  1. 程序先执行 try 中的代码
  2. 如果 try 中的代码出现异常,就会结束 try 中的代码,看和 catch 中的异常类型是否匹配
  3. 如果找到匹配的异常类型就会执行 catch 中的代码
  4. 如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者
  5. 无论是否找到匹配的异常类型,finally 中的代码都会被执行到
  6. 如果上层调用者也没有处理的了异常,就继续向上传递,一直到 main 方法也没有合适的代码处理异常,就会交给 JVM 来进行处理,此时程序就会异常终止

5.自定义异常

具体方式:

  1. 自定义异常类,然后继承自Exception(属于编译时异常或受查异常)或者 RuntimeException(属于运行时异常或非受查异常)
  2. 实现一个带有String类型参数的构造方法,参数含义是出现异常的原因
//自定义异常
class MyException extends RuntimeException{
    public MyException() {
        super();
    }
    public MyException(String s) {
        super(s);
    }
}
//编译时异常
class MyException2 extends Exception{
    public MyException2() {
        super();
    }
    public MyException2(String s) {
        super(s);
    }
}
public class TextDame {
    public static void function1(){
        int a = 10;
        if(a == 10) {
            throw new MyException("自定义异常");
        }
    }
    public static void function2() throws MyException2 {
        int a = 10;
        if(a == 10) {
            throw new MyException2("自定义异常");
        }
    }
    public static void function3() {
        try {
            int a = 10 ;
            if(a == 10) {
                throw new MyException2("哈哈  我自己写的异常!");
            }
        }catch (MyException2 e) {

        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ubuntu】【vmware tools】设置共享目录

1、现象 ubuntu 22 vmware 16,安装后会发现 “Reinstall VMware Tools…” 灰色不可用。如图: 2、原因分析 ubuntu 22 ISO 内不再提供 VMware Tools 的安装包,未检测到所以灰色不可用 在 Ubuntu 22 上挂载 Windows HGFS 共享目录&#xff…

Linux系统之部署Teleport堡垒机系统

Linux系统之部署Teleport堡垒机系统 一、Teleport介绍1.1 Teleport简介1.2 Teleport特点1.3 支持操作系统 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、部署teleport服务端4.1 创建部署目录4.2 下载t…

Sqoop初认识及安装

Sqoop初认识及安装 文章目录 Sqoop初认识及安装Sqoop简介Sqoop原理安装前置条件镜像地址上传安装包解压修改配置文件重命名配置文件 拷贝JDBC驱动验证Sqoop测试Sqoop是否能够成功连接数据库 Sqoop简介 Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库…

redis高可用集群搭建

redis高可用集群搭建 redis的安装配置允许远程访问重启服务检查服务是否启动架构图开始搭建集群安装ruby创建集群高可用测试redis集群的扩展将7号机添加为新的master节点添加从节点删掉一个slave节点删除master节点 redis的安装 sudo apt-get install redis-server配置允许远程…

引进吸收再消化,可借鉴的产业超车模式探索

近期,C919大型客机顺利开启商业首航,这也标志着坐国产大飞机出行的时代来了!C919是我国首次按照国际适航标准自行研制、具有自主知识产权的喷气式干线客机,它的商用飞行也象征着我国对波音、空中客车等大型客机企业垄断地位的一次…

【unity每日一记】unity中常见的特性大全

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

【每日一题】LCP 41. 黑白翻转棋

【每日一题】LCP 41. 黑白翻转棋 LCP 41. 黑白翻转棋题目描述解题思路 LCP 41. 黑白翻转棋 题目描述 在 n*m 大小的棋盘中,有黑白两种棋子,黑棋记作字母 “X”, 白棋记作字母 “O”,空余位置记作 “.”。当落下的棋子与其他相同颜色的棋子在…

JMeter根据负载量计算并发用户数实例

目录 前言: 业务需求 分析需求 测试模型构建 & 用例设计 一、场景构建:登录业务操作流程、考勤打卡操作流程; 二、场景用例设计 三、测试脚本用例设计: 模型构建 登录打卡-操作流程: 场景设计 常用测试场景的类型:…

nx安装llvmlite与numba

文参考 Python安装llvmlite、numba报错解决方案_ClearLon的博客-CSDN博客 llvmlite与numba你可以理解为用于数据处理的加速包 我的python版本为3.6.9,llvmlite版本为0.32.1,numba版本为0.49.1 目录 1 安装 llvmlite 2 安装numba 1 安装 llvmlite…

软件测试技能,JMeter压力测试教程,登录参数化CSV 数据文件设置(五)

目录 前言 一、场景案例 二、登录接口 三、测试数据准备 四、CSV数据文件设置 五、查看结果 前言 我们在压测登录接口的时候,如果只用一个账号去设置并发压测,这样的结果很显然是不合理的,一个用户并发无法模拟真实的情况 如果要压测…

Python的特点和优势

Python的优特点 简单易学: Python语言相对于其他编程语言来说,属于比较容易学习的一门编程语言,它注重的是如何解决问题而不是编程语言的语法和结构。正是因为Python语言简单易学,所以,已经有越来越多的初学者选择Pyth…

你可以不用RxJava,但必须得领悟它的思想!

作者:cofbro 前言 Rx 是一种响应式编程的思想,如今有很多语言都支持这种思想:RxJava,RxJs,RxSwift...。它是基于特殊的观察者模式来实现的,能够轻松的实现异步事件响应流,避免回调地狱的产生。…

Avalon总线协议

Avalon总线主要用于片内处理器与外设,常用于高速数据传输流、读写寄存器和存储器、控制片外器等。 Avalon 总共有七种接口: Avalon Clock Interface, Avalon时钟接口 -- 驱动或接收时钟信号的接口Avalon Reset Interface, Avalon复位接口 -- 驱动或接收…

想要好用的ai绘画工具推荐?分享怎么文字生图片在线

小张: 嘿,小明,你有没有听说过在线将文字转换成图片的工具?我最近在寻找一种方法,可以将我的文字描述转化为视觉图像。 小明: 嗯,听起来很有趣!你是指通过某种技术把文字转换成图片,然后展示出…

亚马逊加购对卖家有什么作用?

对亚马逊卖家来说,亚马逊的加购功能也具有一些重要的作用: 1、增加销售机会:当买家将卖家的商品添加到购物车中时,这表示他们对该商品有兴趣,并考虑购买。这为卖家提供了一个机会,因为购物车中的商品更有可…

【For¥】产品落地到$进账重要流程中你需要知道的东西

文章目录 产品思维空、雨、伞-决策思维5W1H-重点思维矩阵分析法费米推理 工具 开发解决方案(实现)调优(性能)安全 营销运营常见运营岗位分类运营必备能力 销售策略手段方式话术 来源 产品 思维 空、雨、伞-决策思维 产品经理作…

使用yolov5训练自己的数据集并测试效果

1.源码下载链接 1.yolov5原模型以及权重文件 链接:https://pan.baidu.com/s/1XlvHIxlzJEqp2wlRx5Fb1w 提取码:xtkj 2.训练自己数据集的完整代码 链接:https://pan.baidu.com/s/1xdnah8ZLoT7E1YDm-RiGzQ 提取码:9261 2.训练…

CASAIM签约AMOOL TRADING COMPANY LTD,正式进军中东市场

随着3D打印、三维数字化及全自动化智能检测技术的不断进步和应用领域的扩大,全球市场在高速增长。CASAIM作为国内领先的3D打印、三维数字化及全自动化智能检测技术研发及制造商,一直致力于为全球智能制造企业提供高精度、高效率的智能制造及检测解决方案…

【深度学习】segment-anything使用过程

文章目录 官网Checkpoints安装快速体验导出onnxWeb应用jupyter 脚本运行SAM的脚本automatic_mask_generator_example 官网 https://github.com/facebookresearch/segment-anything Checkpoints 三种模型: parser.add_argument( “–model-type”, typestr, requi…

前端JavaScript中的动态事件添加

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言事件的基本概念动态…