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~本次博客到这里就结束了,

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

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

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

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

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

相关文章

Windows系统安装openvino(2024.1.0)

一、openvino下载: 下载地址:下载英特尔发行版 OpenVINO 工具套件 (intel.cn) 下载完之后将压缩包解压,然后重命名文件夹为openvino_2024.1.0。 二、环境配置 以python环境为例:(建议使用moniconda虚拟环境来安装&am…

Android 图表开发开源库 MPAndroidChart 使用总结

1. 引言 电视项目中需要一个折线图表示节电数据变化情况,类比 H5 来说,Android 中也应该有比较成熟的控件,经过调研后,发现 MPAndroidChart 功能比较强大,网上也有人说可能是目前 Android 开发最好用的一个三方库了&a…

【力扣】LCR 130. 衣橱整理

一、题目描述 二、算法思路 这是⼀道非常典型的「搜索」类问题。 我们可以通过「深搜」或者「宽搜」,从 [0, 0] 点出发,按照题目的要求(选择 向右移动一格 或 向下移动一格,但不能移动到衣柜之外 )一直往 [m - 1, …

详解Spring IoCDI(二)

目录 承接上文:详解Spring IoC&DI (一) 1.IoC详解 1.1方法注解Bean 1.2方法注解要配合类注解使用 1.3定义多个对象 1.4重命名Bean 1.5扫描路径 2.DI详解 2.1DI与IoC的关系 2.2属性注入 2.3构造方法注入 2.4Setter注入 2.5 三…

visual studio code 全局搜索

VScode写代码的时候,会经常性的需要进行查找代码,那么怎么在Visual Studio Code中进行查找呢,下面就来大家vscode全局搜索的方法。 想要在vscode全局搜索进行全局搜索,使用快捷键CTRLSHIFTF即可进行搜索,也可以在左边…

哪吒监控+cfcdn+ 反代grp端口

哪吒监控cfcdn 反代grp端口 背景: 哪吒监控:感觉VPS线路不稳定,为了打消自己潜意识,希望量化延迟。 cfcdn:隐藏真实站点,保障小鸡隐秘安全 反代grpc端口: 反代grpc到支持https(TLS)的端口,这…

Elasticsearch 认证模拟题 - 3

1、题目 有一索引有 3 个字段,请写一个查询去匹配这三个字段,并且将三个字段的评分相加作为最后的总评分 # 创建索引 PUT task {"mappings": {"properties": {"fielda":{"type": "text"},"fie…

TrueNAS开启SSH登录ROOT

简介: 从 SCALE Bluefin 22.12.0 开始,为了加强安全性并遵守联邦信息处理标准 (FIPS),root帐户登录已被弃用。所有 TrueNAS 用户都应创建具有所有必需权限的本地管理员帐户,并开始使用它来访问 TrueNAS。当根用户密码被禁用时,只有管理用户帐户才能登录 TrueNAS Web 界面。…

低代码开发平台(Low-code Development Platform)的模块组成部分

低代码开发平台(Low-code Development Platform)的模块组成部分主要包括以下几个方面: 低代码开发平台的模块组成部分可以按照包含系统、模块、菜单组织操作行为等维度进行详细阐述。以下是从这些方面对平台模块组成部分的说明: …

【喜报】科大睿智服务企业通过CMMI3级认证

​北京建投科信科技发展股份有限公司(以下简称“北京建投科技” )前身为北京银帝科技发展公司,成立于1993年,注册资本6,000万元,为中国建银投资有限责任公司(简称“中国建投”)的成员企业建投华…

现在,所有人都能免费用GPT-4o了!

OpenAI今日官宣,ChatGPT正式向所有用户免费开放!所有用户均可以访问定制化GPT、分析图表、询问有关照片的问题以及5月初GPT-4o添加的其他功能。 OpenAI今天在X上发布推文: 「所有ChatGPT免费用户现在都可以使用浏览、视觉、数据分析、文件上…

element table表格行列合并span-method,根据数据动态行列合并

表格行列合并需要用到 table的方法 span-method 根据数据来进行动态的行列合并&#xff0c;实例如下&#xff1a; <el-table:data"tableData":span-method"objectSpanMethod" style"width: 100%"><el-table-columnprop"key"l…

C++系列——————类和对象(上)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、面向对象的三大特征二、类的引入2.1类的定义 三.类的访问限定符3.1访问限定符的介绍3.2.访问限定符的使用 四、类的作用域五、类的实例化六、类对象模型6.1…

JavaScript的内存管理机制

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 一、内存…

Pipecat: 创建语音对话agent的开源框架,支持多模态!

项目简介 pipecat 是用于构建语音&#xff08;和多模态&#xff09;对话代理的框架。诸如私人教练、会议助理、儿童讲故事玩具、客户支持机器人、摄入流程和尖刻的社交伙伴。 看看一些示例应用&#xff1a; 语音代理入门 您可以开始在本地计算机上运行 Pipecat&#xff0c;然…

Nginx(openresty) 开启目录浏览 以及进行美化配置

1 nginx 安装 可以参考:Nginx(openresty) 通过lua结合Web前端 实现图片&#xff0c;文件&#xff0c;视频等静态资源 访问权限验证&#xff0c;进行鉴权 &#xff0c;提高安全性-CSDN博客 2 开启目录浏览 location /file{alias /data/www/; #指定目录所在路径autoindex on; …

【数学不建模】赛程安排

你所在的年级有5个班&#xff0c;每班一支球队在同一块场地上进行单循环赛, 共要进行10场比赛. 如何安排赛程使对各队来说都尽量公平呢. 下面是随便安排的一个赛程: 记5支球队为A, B, C, D, E&#xff0c;在下表左半部分的右上三角的10个空格中, 随手填上1,2,10, 就得到一个赛程…

上位机图像处理和嵌入式模块部署(f407 mcu vs f103)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于一部分嵌入式场景来说&#xff0c;f103其实已经足够了&#xff0c;特别是要求不高的低速场合。如果开发的代码比较多&#xff0c;还可以选用更…

黑马es集群

1、为什么要做es集群 单机的elasticsearch做数据存储&#xff0c;必然面临两个问题:海量数据存储问题、单点故障问题 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&#xff0c;存储到多个节点 单点故障问题:将分片数据在不同节点备份(replica) 2、搭建es集群 1、用…

Python 数据库编程(Mysql)

目录 知识点 游标 提交事务 检索数据 回滚 关闭 增删改查 查询 新增 修改 删除 回滚的用法 知识点 游标 在Python中&#xff0c;数据库游标&#xff08;cursor&#xff09;是用于执行SQL语句并检索数据的对象。游标允许你在数据库中移动并操作数据。在使用Python进…