JavaSE:异常

1、什么是异常

在生活当中,不管是人还是动物又或是植物,都会生病;在程序中也是,作为程序猿,虽然我们会尽力将程序写的完美,可难免会出现一些问题~

在程序执行过程中,发生的一些不正常行为,就叫做异常。

2、异常的体系结构

我们可以观察到,Throwable是异常体系的顶层类,其派生出两个子类Exception(异常)和Error(错误)。

Exception:就是我们平时说的异常,可以理解为我们现实生活中的生病,我们可以通过代码来处理异常,使程序正常运行。

Error指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,例如:StackOverflowError(栈溢出错误),一旦发生就回力乏术。

3、异常的分类

Exception继承于Throwable,也就是说,异常其实是一个类,而异常又分为运行时异常(非受查异常)和编译时异常(受查异常)。

3.1 运行时异常(非受查异常)

其实大家对非受查异常并不陌生,我们平时遇到的例如:数组越界异常、空指针异常、算数异常、类型转换异常等都是非受查异常。

算数异常:

数组越界异常:

空指针异常:

3.2 编译时异常(受查异常)

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常。

例如当我们拷贝自定义类型的对象时,我们没有在main方法中声明异常,就会划红线报错:

受查异常必须进行处理,否则程序无法运行。

抛出异常后,异常警告消失,程序可以执行了。

但是需要注意的是,我们这里只是声明了异常,并没有处理掉这个异常,如果出现了异常,只会交给JVM来处理。一旦交给JVM处理,程序就会立即终止。

那,我们该如何去处理异常呢?

4、异常的处理

在Java中,异常处理主要用到5个关键字:throws、try、catch、throw、finally

4.1 throws 声明异常

我们在上述举例受查异常时就已经提到了throws关键字,当方法中可能会抛出编译时异常时,我们可以使用throws来声明这个异常,告诉调用者:"你要帮我处理掉这个异常!"(该方法不处理,声明异常让调用者处理)

也就是说当前方法不处理这个异常,而提醒方法的调用者,让调用者帮它处理。

当前方法不处理异常而使用throws声明异常后,那该方法的调用者只有两条路走:

1. 老老实实的帮它处理掉这个异常(使用try{}catch{} ,下面会讲)

2. 不想帮它处理异常,也使用throws来声明这个异常(就是我们前面举例受查异常时所用到的解决方法)

也就是说,当编译时异常出现后,必须进行处理!(方法内部处理,或者方法调用者来处理,总之必须处理!)否则程序无法运行!

对于throws关键字有以下几点值得注意:

1. throws必须跟在方法的参数列表之后

2. 声明的异常必须是 Exception 或者 Exception 的子类

3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可

4. 调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出

4.2 try-catch 捕获处理异常

异常抛出后throws并没有处理异常,只是进行了声明,要想捕获处理异常,需要用到try-catch

语法格式:

我们在try{ }代码块中放入可能出现异常的代码,使用catch来进行捕捉,

代码举例:

我们来运行上图的代码:

需要注意的是:

1. 当程序抛出异常后,如果catch中有该异常的捕捉,则程序会直接跳到这个catch块执行catch中的代码,并从这个catch块继续往下执行(程序不会异常终止)。如果catch中没有捕捉到该异常,则会交给JVM来处理,程序也会立即终止。(也就是说我们可以用catch来捕捉多个异常,以免异常被交给JVM处理使程序异常终止)

2. try块中只会抛出一个异常,当异常被抛出,会立即来到对应的catch中进行捕捉,try块内抛出异常位置之后的代码将不会被执行,也就是说即使try块后面的代码有异常,也不会再抛出,所以不会抛出多个异常。

对于printStackTrace方法的作用,就是打印出该异常出现的位置,便于程序猿的发现,

如下图讲解:

try-catch知识点总结:

1. try块内抛出异常位置之后的代码将不会被执行

2. 如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到 JVM收到后中断程序----异常是按照类型来捕获的

3. try中可能会抛出多个不同的异常对象,则必须用多个catch来捕获----即多种异常,多次捕获

4.如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误

5.由于 Exception 类是所有异常类的父类,因此可以用这个类型表示捕捉所有异常(可以放到最后用来兜底,但是极不推荐只使用Exception来捕获异常 )

4.3 throw 手动抛出异常

我们之前讲到的异常的抛出,都是由于触发了JVM的机制由JVM来抛出的异常,这里的throw关键字是用来手动抛出异常的

例如:

因为异常都是一个类,所以我们throw出相应异常的对象就可以,也可以在构造方法传入相关信息。

其实,throw主要用于抛出自定义类型的异常。

需要注意:

1. throw必须写在方法体内部

2. 抛出的对象必须是Exception 或者 Exception 的子类对象(不能抛出自定义类的对象)

3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类(运行时异常),则可以不用处理,直接交给JVM来处理(但程序会立即终止)

4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译

5. 异常一旦抛出,其后的代码就不会执行

4.4 finally 

不管有没有抛出异常,是否被捕获,finally中的代码一定会执行的,一般在finally中进行一些资源清理的扫尾工作。

比如,当程序抛出异常时,要么异常被catch捕获,执行catch后代码;要么异常没有被catch捕获,程序异常终止。这两种情况都是会使程序的某些部分没有被执行,而程序中会有必要的部分必须被执行,例如:资源的关闭,那就可以把这段必须被执行的代码放入finally中。

其实,我们平时用的输入方法就是一种资源,我们利用finally来关闭它:

运行1:

运行2:

运行3:

我们发现,不管有没有抛出异常,也不管抛出异常后catch有没有捕获,哪怕是交给JVM来处理异常(程序异常终止),finally中的代码都被执行了。

我们还可以提前将方法返回:

我们发现,即使方法已经遇见return返回,后面finally中的代码仍然被执行了。

5、自定义异常类

Java当中虽说有着丰富的异常类,但是我们在开发过程中难免会遇见一些不能表示的异常,这时,我们就可以自定义异常。

如何自定义异常呢?

我们可以参考Java给出的异常源码(仅当参考):

仿照源码,创建自定义类,使之继承于Exception 或者 RuntimeException类,给出无参和带参的构造方法。

我们可以模拟实现用户登录界面,当用户名或者密码输入错误时,可以抛出自定义的用户名异常或者密码异常:

首先,写出自定义的用户名异常和密码异常:

当输入用户名或者密码错误时会抛出对应异常:

运行展示:

1.密码输入错误

2.用户名输入错误

3.输入正确

创建自定义异常类需要注意以下几点:

1. 自定义异常通常会继承自 Exception 或者 RuntimeException

2. 继承自 Exception 的异常默认是受查异常(必须捕获处理掉异常)

3. 继承自 RuntimeException 的异常默认是非受查异常

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

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

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

相关文章

2024年5月31日 (周五) 叶子游戏新闻

《Granblue Fantasy: Relink》版本更新 新增可操控角色及功能世嘉股份有限公司现已公开《Granblue Fantasy: Relink》(以下简称 Relink)免费版本更新ver.1.3.1于5月31日(周五)上线的消息。该作是由Cygames Inc.(下称Cy…

进程——linux

目录 冯诺依曼体系结构(计算机组成原理与体系结构) 关于冯诺依曼,必须强调几点: 操作系统(Operator System) 概念 设计OS的目的 定位 如何理解 "管理" 总结 系统调用和库函数概念 承上启下 一、进程 基本概念…

一维时间序列信号的小波模极大值分解与重建(matlab R2018A)

数学上称无限次可导函数是光滑的或没有奇异性,若函数在某处有间断或某阶导数不连续,则称函数在此处有奇异性,该点就是奇异点。奇异性反映了信号的不规则程度,因为信号的奇异点和突变部分往往携带者重要信息,因此信号的…

资深人士称:AI开发游戏会降低游戏成本和体验,不会降低就业率

易采游戏网6月1日最新消息:本周在TD Cowen会议上,R星的母公司Take-Two的CEO Strauss Zelnick对于人工智能(AI)是否会影响游戏开发行业表达了自己的看法。他坚定地认为,AI绝对会改变游戏的制作方式,但不会降低游戏行业的就业水平。…

1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java密室逃脱管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

YOLOv8 segment介绍

1.YOLOv8图像分割支持的数据格式: (1).用于训练YOLOv8分割模型的数据集标签格式如下: 1).每幅图像对应一个文本文件:数据集中的每幅图像都有一个与图像文件同名的对应文本文件,扩展名为".txt"; 2).文本文件中每个目标(object)占一行…

OCR图片转Excel表格:没结构化的弊端

随着OCR技术的不断发展,将表格图片转为excel已不再是难题,但是,目前市面上的程序还大多处于仅能将图片表格转为普通的excel格式阶段,而不能将其结构化,这样就会产生许多的弊端,具体弊端如下: &l…

6个适合在家做的副业兼职,做得好的月入过万,适合上班族和宝妈

嘿,亲爱的朋友们!是不是常常觉得钱包瘪瘪,却又因为种种原因无法外出兼职? 别急,我来为大家揭秘几个在家也能轻松赚钱的靠谱副业,让你足不出户也能月入过万,从此告别财务烦恼! 副业一…

xcode删除依赖包package,删除不必要的依赖项

点击项目,然后点击PROJECT项里面的Package DepenDependencies: 选中一个依赖项,然后点击减号,就可以把依赖项删除掉了,左侧项目下面的Package已经没有了这个依赖项 TARGET下面的package也要删除:在这里删除…

OceanBase开发者大会实录-李楠:4条路径+6大方案,关键业务系统数据库的升级之路

本文来自2024 OceanBase开发者大会,OceanBase 金融与政企事业部解决方案总监李楠的演讲实录 ——《关键业务系统分布式数据库升级路线选择和技术演进之路》。完整视频回看,请点击这里>> 大家好,我是 OceanBase 金融与政企事业部…

第一周 数据结构与算法以及复杂度分析

数据结构与算法 算法定义 算法(algorithm)是在有限时间内解决特定问题的一组指令或操作步骤,它具有以下特性。 1.问题是明确的,包含清晰的输入和输出定义。 2.具有可行性,能够在有限步骤、时间和内存空间下完成。 3.…

利用WMI横向移动

一. WMI介绍和使用 1. WMI介绍 WMI是Windows在Powershell还未发布前,微软用来管理Windows系统的重要数据库工具,WMI本身的组织架构是一个数据库架构,WMI 服务使用 DCOM或 WinRM 协议, 在使用 wmiexec 进行横向移动时,windows 操…

小白跟做江科大32单片机之对射式红外传感器计次

原理部分 1中断示意图,中断会打断主函数的执行,终端执行完成之后再返回主函数继续执行 2.STM32中断 这些灰色的是内核中断 这些白色的是普通中断 3.NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组…

超大功率光伏并网逆变器学习(三相)

1.超大功率用的IGBT开关频率通常很低,比如6KHz 2.线电压和相电压的关系 相电压 A AB线电压-CA线电压 相电压 B BC线电压-AB线电压 相电压 C CA线电压-BC线电压 3.坐标变换 ABC三相信号通过Clark坐标变换得到αβ两相静止信号,其中α与A相重合,β与α…

ElasticSearch教程(详解版)

本篇博客将向各位详细介绍elasticsearch,也算是对我最近学完elasticsearch的一个总结,对于如何在Kibana中使用DSL指令,本篇文章不会进行介绍,这里只会介绍在java中如何进行使用,保证你看完之后就会在项目中进行上手&am…

为何选择 MindMapper

MindMapper是一款专业的可视化思维导图软件,通过智能绘图方法,在管理信息和 处理工作流程中,帮助提高组织、审查、合作、分享和交流能力。 企业创造力 在企业界,MindMapper思维导图软件可以提高生产力和沟通效果,以及…

复试不考机试,初试300分以上,上岸稳了?东北林业大学计算机考研考情分析!

东北林业大学(Northeast Forestry University),简称东北林大(NEFU),位于黑龙江省哈尔滨市,是一所以林科为优势、林业工程为特色的中华人民共和国教育部直属高校,由教育部、国家林业局…

LIO-EKF: 运行数据UrbanNav与mid360设备详细教程

一、代码连接 代码下载连接: YibinWu/LIO-EKF: Maybe the simplest LiDAR-inertial odometry that one can have. (github.com) 编译步骤: cd srcgit clone gitgithub.com:YibinWu/LIO-EKF.gitcatkin_makesource devel/setup.bash 运行步骤: …

2024年6月1日 (周六) 叶子游戏新闻

Embracer探讨单机游戏大作涨价超过70美元的可能性在Embracer集团等待公布新公司名称的同时,他们对游戏大作的价格上涨做出了评论。几年来,游戏大作的价格已经达到了70美元的门槛。Embracer集团的CEO Lars Wingefors在采访中表示,电子游戏行业…

STM32 定时器与PWM的LED控制

学习目标: 1. 使用定时器的某一个通道控制LED周期性亮灭; 2. 采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭。 一、定时器 1、STM32定时器介绍 STMicroelectronics是STM32微控制器中的重要块,具有丰富的外设和功能&#xff0…