Java【异常】

news2024/11/26 16:43:26

异常

  • 1. 异常概念
    • 程序开发中常见异常
  • 2. 异常的体系结构
    • 2.1 异常体系核心父类
      • 异常的另外划分模式
  • 3. 异常的处理流程
    • 3.1 异常的捕获并处理try-catch-finally代码块
      • 组合一:try catch
      • 组合二:finally代码块
        • finally不执行的特殊情况
    • 3.2 throw 和 throws
    • 3.3 自定义异常

1. 异常概念

异常:程序执行过程中的不正常行为。异常是发生在程序执行过程中,遇到某些代码执行不下去,称之为异常。语法的错误并不属于异常,在编译阶段就会进行报错。

程序开发中常见异常

  1. 越界异常
    索引下标非法:访问了数组中不存在的位置,越界异常
int[] num=new int[3];
System.out.println(num[3]);
  1. NPE空指针异常
    通过一个值为null的引用调用成员方法/属性
int[] num=new int[3];
num=null;
System.out.println(num[1]);
  1. 类型转换异常
    发生在两个毫无关系的类之间对象的转换(要发生向下转型首先得发生向上转型)
int[] num=new int[3];
num=null;
System.out.println(num[3]);

异常的出现是具有逻辑顺序的,面对空指针异常和越界异常,在程序运行时,只要碰到异常,通常会选择第一个异常进行抛出,终止程序运行。

2. 异常的体系结构

在Java中,异常也是类,一切皆对象。程序所抛出的异常,抛出的就是异常对象,只不过该对象是由JVM产生并返回给程序的!

2.1 异常体系核心父类

  • Error:JVM无法解决的严重问题,当出现Error类问题,程序是无法解决的,只能退出。
    StackOverFlowError(栈溢出) OutMemoryError(堆溢出)
  • Exception:异常产生后,程序员可以通过异常的处理流程来解决此类问题,使得程序能够继续执行。

异常的另外划分模式

  • 受查异常/编译时异常
    在程序编译时必须显示进行异常处理的异常,称为受查异常。受查异常若不进行处理,则程序会卡在编译阶段,无法运行。
    例如:IOException、ClassNotFoundException、SqlException…除了非受查异常之外的都是受查异常。
    以clone()方法为例:
    在这里插入图片描述
  • 非受查异常/运行时异常
    程序编译时没有产生任何错误,但是程序执行时发生的异常称为非受查异常。
    例如:Error、RuntimeException以及其子类(Arithmetic Exception、ClassCastException、IlegalArgumentException…)、NPE问题,属于程序执行起来出现的异常,非受查异常/运行时异常

3. 异常的处理流程

异常处理的5个主要关键字try catch finally throw throws

3.1 异常的捕获并处理try-catch-finally代码块

try{
//可能产生的异常放在try代码块中
}[catch(异常类型 异常对象)][0...N]{
//若捕获到了相应类型的异常对象,如何处理
//放在catch代码块中
}[finally]{
//无论是否有异常产生或者是否处理异常,最终一定会执行的代码放在finally代码块中
//finally中的代码块一定会被执行到
}

组合一:try catch

try{

}catch(异常类型 异常对象){

}catch....{

}

a. 当没有异常产生时,不走catch块,程序正常执行结束
b. 当异常产生,且被正确的捕获到,则走相应的catch代码块,try代码块中从出现异常之后的代码不再执行;但是异常体系之后的代码会正常执行!
在这里插入图片描述
有异常处理之后,保证程序抛出异常之后,正确捕获该异常,就可以使得异常体系结构之后的代码继续执行。

c. 关于catch块捕获异常的说明

  • 当try中可能会产生多种异常时,可以使用多个代码块进行捕获;

  • 也可以捕获异常的父类,通过向上转型来进行异常捕获(不推荐,具体异常不明确,只要不是error,都可以进行捕获)

  • 输出异常产生的原因及位置,调用异常对象的printStackTrace()方法,异常出现时,由JVM产生异常对象并返回给程序。

try{
//异常代码
}catch(Exception e){
e.printStackTrace();
}
  • 若catch代码块有多个分支,且多个分支有父子关系的情况,一定是子类异常的捕获要写在父类异常捕获之前。
try{
//异常代码
num=null;
System.out.println(num[100]);
System.out.println("其他代码");
}catch(NullPointerException e){
System.out.println("捕获到空指针异常");
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
System.out.println("异常之后代码");
  • 多个catch块只会走一个,从上至下,匹配多个catch块,直至碰见第一个满足的catch代码块就进入,其他的代码块不再执行!跳转至异常体系之后的代码执行。

组合二:finally代码块

try{

}catch(异常类型 异常对象){

}finally{
无论是否产生异常,都会执行的代码块
}
  • 未捕获异常:当产生异常后,没有被捕获的情况下,程序需要退出,程序退出之前,finally代码块需要先执行,再退出程序。
  • 对异常进行捕获后:当try catch finally都有返回值时,使用catch对异常进行捕获,程序此时能够正常执行,在方法结束之前,先执行finally中的代码块,再进行返回值return。
  • 无论是否产生异常,且是否具有返回值,finally中的代码块一定是会执行的!
    在这里插入图片描述
  • 位置1和位置2的代码有什么区别?
    当有异常产生时,1,2都会执行,return 3;
    如果没有异常产生,catch中的语句不会执行,执行finally之后,直接return 1从try中结束调用,不会执行2对应的代码。

总结:
所有关于资源关闭的操作,都会放在finall代码块中,文件的关闭,数据库连接的关闭,统一都放在finally代码块中,确保该资源一定会被关闭。

  • 若finally有return语句,无论是否有异常产生,都会返回finally的返回值,因此一般不在finally中写return语句。

finally不执行的特殊情况

在这里插入图片描述
正常编码,finally一定会正常执行;若出现导致JVM进程直接退出的情况,finally才不会执行,eg:System.exit(0);

3.2 throw 和 throws

若出现异常,不会进行处理,将异常抛回给调用者处理。

  • throws:用在方法声明上,明确表示该方法可能产生某些异常,但是该方法不处理,若出现异常,将异常对象抛回给调用者处理

在这里插入图片描述

若在整个调用过程中没有一个位置进行异常处理,最终这个异常对象就会抛回给JVM,整个程序退出。

关键点:
(1)throws 关键字在方法列表之后进行定义;
(2)throws 可以抛出多个异常,多个异常使用‘,’进行分隔,若有父子关系,只需要抛出父类异常即可;
(3)throws 抛出的必须是Exception以及其子类。

特殊说明:

若throws抛出的是受查异常,则调用者必须进行显式的异常处理(要么使用try catch捕获,要么继续通过throws向上抛出)
clone抛出CloneNotSupportedException (受查异常) 代码示例

在这里插入图片描述

  • throw:用在方法内部,程序员在出现异常时,自己产生异常对象并向外抛出,(原来异常对象是由JVM产生,现在程序员自己产生异常对象),一般搭配自定义异常使用。
    手动产生非受查异常,编译不报错,程序执行到此,相当于JVM产生了异常对象,可以使用异常的处理流程进行处理

对于异常未作处理,相当于throws向外抛出的情况
在这里插入图片描述 使用try catch对自己产生的异常进行捕获处理在这里插入图片描述
总结:
无论是哪种方式产生的对象(JVM产生还是自己throw new的对象)与异常产生的方式无关。
是否需要进行显式处理,需要判断异常对象是受查异常还是非受查异常;只要是受查异常就必须进行显式异常处理!!!

3.3 自定义异常

以简单用户登录为例:

public class MyException {
    static String userName="张三";
    static String passWord="123";
    public static void main(String[] args) throws UserNameException {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入您的用户名:");
        String user=sc.nextLine();
        System.out.println("请输入您的密码:");
        String pass=sc.nextLine();
        login(user,pass);
    }

    public static void login(String userName,String passWord) throws UserNameException {
        if(!userName.equals(MyException.userName))
        {
            //抛出用户名错误异常
            throw new UserNameException("用户名错误!");
        }
        if(!passWord.equals(MyException.passWord))
        {
            //抛出密码错误异常
            throw new PassWordException("密码错误");
        }
          System.out.println("登录成功!");
    }
}
//用户名属于受查异常
class UserNameException extends Exception{
    //只需要提供构造方法即可
    public UserNameException(String msg){
        super(msg);
    }
}
//密码错误属于非受查异常
class PassWordException extends RuntimeException{
    public PassWordException(String msg){
        super(msg);
    }
}

在这里插入图片描述

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

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

相关文章

8 系统定时器(Systick)(STM32HAL库)

目录 系统定时器(Systick) SysTick定时器特性介绍 SysTick定时器的功能 SysTick定时器寄存器介绍 Systick定时器的使用 系统定时器(Systick) SysTick定时器特性介绍 计数宽度: 24bit来存储数据,2^24…

Spring高手之路7——事件机制与监听器的全面探索

文章目录 1. Spring中的观察者模式2. 监听器2.1 实现ApplicationListener接口创建监听器2.2 EventListener注解创建监听器2.3 对比ApplicationListener接口和EventListener注解的创建方式 3. Spring的事件机制3.1 ApplicationEvent3.2 ApplicationContextEvent3.3 ContextRefre…

基于weka平台手工实现(LinearRegression | Ridge Regression,岭回归)

一、普通的线性回归 线性回归主要采用最小二乘法来实现,主要思想如下: X ( x 11 x 12 ⋯ x 1 d 1 x 21 x 22 ⋯ 5 1 ⋮ ⋮ ⋱ ⋮ ⋮ x m 1 x m 2 ⋯ x m d 1 ) X\left( \begin{matrix} x_{11} & x_{12} & \cdots & x_{1d} & 1 \\ x_{2…

Vinted店铺为什么被封?如何应对?

Vinted是一家在线二手交易平台,专门用于买卖衣物和时尚配件。自从2022年以来,Vinted也越来越向综合性跨境电商平台转变。细心的伙伴都会发现,近来Vinted这阵子封号确实很严重,感觉是风控变严格了,但是万变不离其宗&…

xhtmlrenderer 将html转换成pdf,设置多字体, 以及中文不显示的问题

接上一篇 https://blog.csdn.net/qq_21480147/article/details/131187202 多字体 字体文件自行搜索或者window中自带的搜索(C:\Windows\Fonts) 中文不显示 在要渲染的中文的地方中设置stylefont-family:[字体] 该字体需要对应指定的属性, 属性参考:

java程序改变io临时存储路径

System.setProperty(“java.io.temdir”,“your path”)

【UE5 Cesium】08-Cesium for Unreal 子关卡应用实例(上)

UE版本:5.1 效果 (运行游戏可以看到进入关卡体积内楼房模型才会显现,以此来减少电脑性能消耗) 步骤 一、新建两个子关卡(以北京和上海为例) 点击窗口-》关卡-》新建 命名第一个子关卡为“SubLevel_Bei…

计算机专业学生暑假要去看这些经典书籍!

好书在精不在多,每一本经典书籍都值得反复咀嚼,温故而知新! 分享几本经典书籍。 重构 改善既有代码的设计 就像豆瓣评论所说的,看后有种醍醐灌顶、欲罢不能的感觉。无论你是初学者,还是深耕多年的老手,这…

Bytebase VS Yearning

下文对 Bytebase 和 Yearning 两个数据库管理工具进行了多维度比较🔍。 产品功能定位 Yearning:功能较为单一的独立数据库审核工具,适合小团队进行简单的 SQL 审核,若要应对复杂需求必须进行大量二次开发,用户群更偏…

从功能测试进阶自动化测试,熬夜7天整理出这一份3000字超全学习指南!

因为我一直在分享自动化测试技术,所以,经常被问到: 功能测试想转自动化,请问应该怎么入手?或者有哪些书推荐? 那么,接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。 测试新…

【技术操作】EasyCVR如何在分享页增加控制台跳转?

EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。 在Ea…

6.4.2 文件隐藏属性

chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效, 其他的文件系统可能就无法完整的支持这个指令了,例如 xfs 仅支持部份参数而已。 chattr (设置文件隐藏属性) 这个指令很重要,在系统的数据安全上面…

互联网医院平台|互联网医院搭建|线上医疗系统开发必要功能

医疗服务行业一直以来都有着较好的发展市场,为了进一步拓展医疗行业的发展空间,开始选择布局线上渠道,互联网医院平台的出现解决了线下就医的一些困境,比如改善人流如潮的情况,提升医护人员的工作效率,那么…

AutoSAR系列讲解(入门篇)3.1-RTE概述

一、什么是RTE RTE的作用有点像一个快递中转站或者说是电话接线员(就是上个世界那种要先打电话到接线员那里,然后通过接线员转接电话线到目的地),其作 用就是将一个SWC的信息通过RTE连接到其他SWC或者BSW上。且RTE具有管理这些信…

前端新增校验关键属性是否重复

需求:前端新增某个属性时,该属性下可新增列表,列表编码禁止重复(未提交该属性时前端校验列表编码是否重复) js:新增后校验 let arrayCode if (this.collectionPointList.length 0) {this.collectionPoint…

自制聊天机器人实现与chatgpt或微信好友对话【附代码】

闲来无事,想实现一个可与chatgpt或者微信好友对话的聊天机器人。该聊天机器人还可应用于QQ好友或者其他地方的语音输入。功能还是比较简单的,后期会慢慢更新,让人机交互体验感不断提升。 项目描述: 语音输入"开启语音助手&…

Linux常用命令——fmt命令

在线Linux命令查询工具 fmt 读取文件后优化处理并输出 补充说明 fmt命令读取文件的内容,根据选项的设置对文件格式进行简单的优化处理,并将结果送到标准输出设备。 语法 fmt(选项)(参数)选项 -c或--crown-margin:每段前两列缩排&#…

Django期末复习总结【内含思维导图帮助梳理】

Django-最下面有笔记的下载链接 初始Django框架 MTV设计模式 Model(模型) Template(模板) View(视图) Django项目框架搭建 创建项目骨架 django-admin startproject my_project1 启动服务 python mana…

2 线程基础知识复习

1、并发相关Java包 涉及到的包内容 java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks 2、并发始祖 3、start线程解读 初始程序 public static void main(String[] args) {Thread t1 new Thread(() ->{},"t1");t1.start();}//…

从功能测试到自动化测试,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说,我刚入行的时候每天做的也是最基础的工作,但是随着时间的消磨,我产生了对自我和岗位价值和意义的困惑。一是感觉自己在浪费时间,另一个就是做了快2年的测试,感觉每天过得浑浑噩噩&#xff0c…