Java中的异常(Exception)

news2024/11/27 10:40:54

目录

 一、什么是异常(Exception)?

二、解决方案:try-catch

三、异常的概念

 四、异常的体系图(重点)

 小结:

五、常见的五大运行时异常

1、NullPointerException空指针异常

2、ArithmeticException数学运算异常

3、ArrayIndexOutOfBoundsException数组下标越界异常

4、ClassCastException类型转换异常

5、NumberFormatException数字格式不正确异常

 六、编译异常

 七、异常处理机制

1、try-catch-finally

​编辑

2、throws

八、自定义异常

九、throw和throws的区别

目录的图片:

 一、什么是异常(Exception)?

下面代码中的注释写的很清楚。

package com.hspedu.Exception;

public class Exception01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;

        //1.当执行到num1/num2,因为num2 = 0,程序就会抛出异常ArithmeticException。Arithmetic(adj 算术的)
        //2.抛出异常后,程序就退出,因为崩溃了,下面的代码不再执行。
        //3.在2中叙述的情况,在现实中不合理,不应该因为出现了一个不算致命的问题,就导致整个系统崩溃。
        //4.因此java设计者提供了一个叫 异常处理机制 来解决该问题。
        int res = num1/num2;
        System.out.println("程序继续运行......");  //不会输出该句
    }
}

二、解决方案:try-catch

如果一段代码可能出现异常,可以使用try-catch异常处理机制来解决,从而保证程序的健壮性。

下面是try-catch机制的小例子:

package com.hspedu.Exception;

public class Exception01 {
    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 0;

        //1.当执行到num1/num2,因为num2 = 0,程序就会抛出异常ArithmeticException。Arithmetic(adj 算术的)
        //2.抛出异常后,程序就退出,因为崩溃了,下面的代码不再执行。
        //3.在2中叙述的情况,在现实中不合理,不应该因为出现了一个不算致命的问题,就导致整个系统崩溃。
        //4.因此java设计者提供了一个叫 异常处理机制 来解决该问题。
        //5.有了try-catch机制后,即使出现了异常,程序仍然能够运行
        try {
            int res = num1/num2;
        } catch (Exception e){
            //e.printStackTrace();  //这种是标准写法
            System.out.println("出现异常的原因= " + e.getMessage());  //e.getMessage()就是获取异常信息,这样写更舒服一点
        }
        System.out.println("程序继续运行......");  //不会输出该句
    }
}

三、异常的概念

前面的例子就是运行时异常。

 四、异常的体系图(重点)

对下图的解读(只是部分):Throwable类实现了Serializable接口,并继承了父类Object。Error和Exception都是Throwable类的子类,Exception下又分为运行时异常(RuntimeException)和编译时异常(像FileNotFoundException和ClassNotFoundException都是编译时异常)。虚线代表实现类接口,实现是代表继承,该图清晰的体现了继承和实现接口关系。

 

 

 小结:

五、常见的五大运行时异常

1、NullPointerException空指针异常

在需要使用对象的地方用null时,抛出该异常。

继承关系如下图:

 下面是案例:

package com.hspedu.Exception;
//这就是一个空指针异常
public class NullPointerException {
    public static void main(String[] args) {
        String name = null;
        System.out.println(name.length());
    }
}

2、ArithmeticException数学运算异常

当出现异常的运算条件时,抛出该异常,eg:整数除以0的时候。(上面有案例)

 继承关系如下图:

3、ArrayIndexOutOfBoundsException数组下标越界异常

索引为负数or超出数组范围,抛出该异常。

  继承关系如下图:

4、ClassCastException类型转换异常

将对象强制转换为不是实例的子类时,抛出该异常。(涉及到对象的多态)

   继承关系如下图:

5、NumberFormatException数字格式不正确异常

将字符串转换成数值的时,不能适当转换,抛出该异常。

 继承关系如下图:

 六、编译异常

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。

常见的编译异常:

  • SQLException  //操作数据库时,查询表可能发生异常
  • IOException  //操作文件时,发生的异常
  • FileNotFoundException  //当操作一个不存在的文件时,发生异常
  • ClassNotFoundException  //加载类,而该类不存在时,发生的异常
  • EOFException  //操作文件,到文件末尾发生异常
  • IIIegalArgumentException  //参数异常

 七、异常处理机制

异常处理就是当异常发生时,处理异常的方式。

1、try-catch-finally

在代码中捕获发生的异常,自行处理。

模板:

try{
    //代码(可能有异常)
}catch (Exception e){
    //捕获到异常:
    //1.异常发生
    //2.系统将异常封装成Exception对象e,传递给catch代码块
    //3.得到异常对象后,程序员自行处理,在这里可以添加业务逻辑,
    // 或者只是单纯的打印异常也行
    //4.如果没有发生异常,catch代码块不执行
}finally {
    //1.不管try代码块是否有异常发生,始终都要执行final
    //2.所以通常将关闭连接、释放资源的代码,放在finally里面
}

Tips:

(1)如果try代码块可能有多个异常,可以使用多个catch分别捕获不同类型的异常,并作出相应处理。但是要求子类异常写在前面,不然会报错,例如下面的catch(Exception e)就写在了最后,因为如果catch(Exception e)写在前面,在这个catch代码块 就直接捕获了所有异常,下面再写catch不同类型的异常,没有意义。

(2)可以try-finally配合使用,这种做法相当于没有捕获异常,程序会直接崩掉。应用场景是:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。

try{
    //代码
}finally{
    //总是执行
}    

(3)当try块中的异常发生后,try块中剩下的语句就不再执行,将执行catch块中的语句,如果有finally,还要再执行finally块中的语句。

2、throws

将发生的异常抛出,交给调用者(方法)处理,最顶级的处理者是JVM。

如果一个方法中可能出现异常,但是无法确定怎么处理该异常,则该方法应显式的声明抛出异常,表明该方法不对这些异常进行处理,而是由该方法的调用者负责处理

 解释:JVM调用main方法,main方法调用f1方法,f1方法调用f2方法。当f2方法中出现异常,有两种选择(1.在f2方法中try-catch-finally;2.throws给f1方法),后面的以此类推,最高可以抛给JVM。(JVM处理异常的方式很暴力(JVM说:都不管我也不管),1.输出异常信息;2.退出程序。)(村里除了问题,村长抛给县长,县长抛给市长,市长抛给省长,直到最高层(JVM))

模板:

    //1.在方法声明中用throws语句抛出异常,throws关键字后面的异常类型可以是方法中产生的异常类型,
    //例如FileNotFoundException,也可以是它的父类Exception。
    //2.throws关键字后也可以是异常列表,即可以抛出多个异常。
    // eg:public void f2() throws FileNotFoundException, NullPointerException, ArithmeticException
    public void f2() throws FileNotFoundException, NullPointerException, ArithmeticException {
        //创建了一个文件流对象
        FileInputStream fileInputStream = new FileInputStream("d://a.txt");
    }

Tips:

(1)对于运行时异常,程序中如果没有处理,默认就是throws的方式处理。
(2)子类重写父类的方法时,规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么就是父类抛出的异常的类型的子类型。

(3)在throws过程中,如果有方法try-catch,就相当于处理异常,可以不用throws。

八、自定义异常

当程序中出现某些错误,但该错误信息并没有在Throwable子类中描述处理,此时可以自己设计异常类,用于描述该错误信息。

自定义异常的步骤:

例子:(看下面的例子就能明白自定义异常)

要求是接收Person对象年龄时,要求范围在18~120之间,否则抛出一个自定义异常(要求继承RuntimeException),并给出提示信息。

package com.hspedu.Exception;

public class customException {
    public static void main(String[] args) {
        int age = 80;
        //要求范围在18~120之间,否则抛出一个自定义异常
        if (!(age >= 18 && age <= 120)){
            //这里我们可以通过构造器,设置信息
            //注意这里是throw!!不是throws!!
            throw new AgeException("年龄需要在18~120之间");
        }
        System.out.println("你的年龄范围正确");
    }
}

//自定义一个异常
//1.一般情况下,我们的自定义异常是继承RuntimeException,即把自定义异常做成是运行时异常
//好处是,可以使用默认的默认处理机制
class AgeException extends RuntimeException{
    public AgeException(String message) {  //构造器
        super(message);
    }
}

九、throw和throws的区别

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

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

相关文章

【MySQL进阶】浅谈InnoDB中的BufferPool

【MySQL进阶】浅谈InnoDB中的BufferPool 文章目录【MySQL进阶】浅谈InnoDB中的BufferPool一、前言——缓存的重要性二、InnoDB的Buffer Pool1&#xff1a;BufferPool 简介2&#xff1a;BufferPool内部组成3&#xff1a;free链表的管理4&#xff1a;flush链表的管理5&#xff1a…

PCA与PCoA

通过分析坐标轴中样本和样本间的距离可看到 2 个样本或 2 组样本间的差异性。若2个样本或2组样本之间的直线距离较近&#xff0c;则表示这2个样本或2组样本差异性较小&#xff1b;相反则表示差异性较大。因此PCA和PCoA 具有直观性(直接看两点之间的距离)和完整性(呈现所有样本)…

spring中i18n国际化处理多语言

前言 在项目中&#xff0c;往往用户会存在多语言的述求&#xff0c;比如说一个系统既有中文的用户&#xff0c;又有英文的用户。怎么来实现多语言呢&#xff1f; 首先前后端分离的项目&#xff0c;前端会有自己的多语言实现方案&#xff0c;大致效果就是&#xff0c;用户切换…

rocketmq源码-pull模式拉取消息、同步拉取消息

前言 上一篇博客&#xff0c;记录的是push模式&#xff0c;异步发送netty请求拉取消息的代码&#xff0c;这篇博客主要记录consumer发送同步netty请求&#xff0c;去拉取消息的逻辑&#xff0c;但是对于同步发送请求&#xff0c;需要结合LitePullConsumer来看 在Lite PullCon…

C语言基础—运算符及优先级

本章主要讲解运算符的优先级和结合顺序 知识点&#xff1a; 运算符分类&#xff0c;记忆了解13种运算符注意运算符的易错点运算符的优先级 运算符及优先级运算符分类❗ 运算符易错不能直接连续判断“< 值 <”关于判断两个浮点数是否相等逻辑表达式&#xff08;布尔型&am…

CSS:border-image

border-image属性对图像的规格和比例比较高&#xff0c;导致使用成本比较高。另外&#xff0c;常见的场景中&#xff0c;大家更倾向于扁平化而不是非拟物化&#xff0c;边框装饰通常在项目中不会出现。 border-image是由多个CSS属性缩写的&#xff0c;比如: border-image-sou…

hc32和stm32 can波特率设置

前言 笔者在调试一款新的mcu的can通信时候&#xff0c;最麻烦的是波特率设置。由于没有弄明白其计算原理&#xff0c;经常出错&#xff0c;且不同的波特率有不同的采样点的要求。浪费了不少时间。这次一次搞明白can波特率的计算公式。 can波特率计算 在ISO 11898-1-2015 标准…

音视频基础概念(2)——音频

目录 1. 基本知识 2.采样率和采样位数 3.音频编码 4. 声道数 5. 码率 6. 音频格式 日常生活中&#xff0c;音视频随处可见&#xff0c;包括视频、音频、编解码、封装容器、音视频等概念。 1. 基本知识 音频数据的承载方式最常用的是脉冲编码调制&#xff0c;即PCM。于…

JAVA面试(2022年Java常见面试问题)

1、谈谈你对Spring中IOC和AOP的理解。 答案&#xff1a; 2、谈谈Spring的bean的创建过程和生命周期。 答案&#xff1a; 3、谈一下JVM的内存分配和垃圾回收机制。 答案&#xff1a; 4、谈一下你使用比较多的设计模式和场景。 答案&#xff1a; 5、谈一些mysql的事务隔离。 …

什么是文件系统?

【推荐阅读】 一文了解Linux上TCP的几个内核参数调优 一文剖析Linux内核中内存管理 分析linux启动内核源码 文件系统是操作系统用于明确存储设备&#xff08;常见的是磁盘&#xff0c;也有基于NAND Flash的固态硬盘&#xff09;或分区上的文件的方法和数据结构&#xff0c;…

传奇列表上传登录器公告小窗口怎么修改

传奇列表上传登录器公告小窗口怎么修改 很多小伙伴不会上传列表&#xff0c;我是艾西今天给大家分享下怎么上传列表 我们开始实操&#xff08;纯教学分享&#xff09; 在我们的网站文件夹里创建一个列表.txt 在浏览器里找一个列表模板例&#xff1a;www.pkp123.cn:88&#xff…

1570_AURIX_TC275_SCU_ERU

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 从系统的逻辑图看&#xff0c;能够很清楚看到这个模块的功能处理过程&#xff1a;首先是边沿信号的识别&#xff0c;接着是根据判断进行置位处理&#xff0c;最后进行工作触发。如果设置的…

使用Nordic的nRF52840 Dongle配合Wireshark对蓝牙设备抓包(BLE)

硬件准备&#xff1a; 1&#xff09;nRF52840 Dongle 2&#xff09;待抓包的蓝牙设备 软件准备&#xff1a; 1&#xff09;Python 2&#xff09;Wireshark 3&#xff09;nRF Sniffer for Bluetooth LE Python安装 需要注意的是下载的nRF Sniffer for Bluetooth LE版本是否…

K8s 之 Deployment 应用案例

目录一、YAML 配置文件二、运行服务三、更新 Deployment3.1 动态伸缩容3.2 触发上线四、故障自动转移五、指定节点运行 Pod六、删除 deployment一、YAML 配置文件 我们要清楚&#xff0c;在 K8s 中有两种创建资源的方式&#xff1a; &#xff08;1&#xff09;命令行方式&…

【GO】 K8s 管理系统项目[API部分--Pod]

K8s 管理系统项目[API部分–Pod] 前端: Vueelement plus 后端: gogin 1. 功能设计 2. 初始化 2.1创建项目 2.2 配置goproxy GOPROXYhttps://goproxy.cn 2.3 添加格式化工具 2.4 安装模块 go get k8s.io/client-go/tools/clientcmd go get k8s.io/api/core/v1 go get k8s.i…

使用 docker buildx 构建跨平台 Go 镜像

目录 前提 docker buildx 启用 Buildx builder 实例 构建驱动 buildx 的跨平台构建策略 一次构建多个架构 Go 镜像实践 源代码和 Dockerfile 执行跨平台构建 验证构建结果 如何交叉编译 Golang 的 CGO 项目 准备交叉编译环境和依赖 交叉编译 CGO 示例 总结 参考链接…

供水设备远程监控客户案例

一、客户介绍 客户积累多年的技术研发和工程运维经验&#xff0c;对传统的恒压供水工程所面临的维护难、维修难、运维效率低和能耗管控弱等诸多问题有深刻的体会&#xff0c;经过广泛调研&#xff0c;客户最终选择使用蓝蜂物联网的云平台和边缘计算产品对恒压供水设备和工程进行…

数据处理指令(一)—— 搬移指令MOV、MVN

数据处理指令指的是和数学运算、逻辑运算相关的指令&#xff0c;比如加减乘、与或非、赋值比较等 目录 1、MOV —— 直接搬移 (1) MOV 指令格式 (2) MOV生成指令的策略&#xff08;MOV的优点&#xff09; (3) MOV 只能搬移“立即数”的原因&#xff08;MOV的缺点&#x…

问卷设计一:问卷题目哪些有类型和注意要点?

问卷法常被人们应用于社会调查中&#xff0c;它能反馈出最真实的社会信息。所以&#xff0c;很多企业为了最大程度地了解市场&#xff0c;也经常使用问卷调查法进行研究。不过&#xff0c;想要发挥出问卷法的最大用处&#xff0c;前提是要将问卷设计规范并且可量化。 想要设计…

用ArkTs在鸿蒙系统上画一个世界杯海报

偶然看到了CSDN关于世界杯的征文活动&#xff1a; 用代码画一个足球&#xff1f; 哈哈很有意思&#xff01; 想了想&#xff0c;画一个自定义View&#xff08;足球&#xff09;&#xff0c;当然是使用Canvas了&#xff0c;但除了Canvas还有没有其它方法呢&#xff1f;那是必须…