【Java】/* 异常 */

目录

​编辑

一、错误和异常的体系

二、异常

2.1 异常的分类

2.2 异常的处理形式

2.3 如何抛出异常

2.4 捕获处理异常

2.5 finally存在的意义

2.6 异常处理流程总结

2.7 自定义异常类


一、错误和异常的体系

1. Java中所有的异常和错误都有对应的类来进行描述

2. 由于异常和错误的种类繁多,为了对其进行管理,Java内部维护了一个关于异常和错误的体系(下图为不完整示意图,上下级之间表示继承关系):

① Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception。

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

③ Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。我们平时所说 的异常就是Exception。

注意:编译时出现的语法性错误,不能称之为异常或错误,例如:将 System.out.println 拼写错了, 写成了 system.out.println,这并不属于Exception 或 Error。

二、异常

2.1 异常的分类

1. 根据异常的发生时机不同,异常可以分为:编译时异常,也称为受检查异常(上图黄色部分) 和 运行时异常,也称为非受检查异常(上图绿色部分)。

2. 编译时异常:例如:在利用Object类中的clone方法实现对象的克隆时,出现的CloneNotSupportedException。

    运行时异常:例如:ArrayIndexOutOfBoundsException(数组越界异常)、NullPointerException(空指针异常)、ArithmeticException(算术访问异常)。 

2.2 异常的处理形式

1. 错误在代码中是客观存在的,因此我们要让程序出现问题的时候及时通知程序猿,处理异常的两种方式:

① 事前防御型(LBYL: Look Before You Leap):这种做法的缺陷:正常流程和错误处理流程代码混在一起, 代码整体显的比较混乱,因此一般不会采取这种写法。

② 事后认错型(EAFP: It's Easier to Ask Forgiveness than Permission):使用try-catch-finally结构,这种做法的优势:正常流程和错误流程是分离开的, 代码更清晰,容易理解代码(示例代码如下图),因此一般会采取这种写法。

try {登陆游戏();开始匹配();游戏确认();选择英雄();载入游戏画面();...
} catch (登陆游戏异常) {处理登陆游戏异常;
} catch (开始匹配异常) {处理开始匹配异常;
} catch (游戏确认异常) {处理游戏确认异常;
} catch (选择英雄异常) {处理选择英雄异常;
} catch (载入游戏画面异常) {处理载入游戏画面异常;
} finally {......
}

2. 在Java中,异常处理主要的5个关键字:try、catch、finally、throw、throws。

2.3 如何抛出异常

1. 处理异常的前提是抛出异常,抛出异常有两种方式:

    ①程序本身触发异常 ② 程序员手动抛出异常

2. Java中可以借助throw关键字手动抛出一个指定的异常对象,具体语法如下:

     throw new xxxException("xxxx");

3. 注意:① throw必须写在方法体内部。

               ② 抛出的异常对象一定是Exception类 或 RunTimeException的子类。

               ③ 如果抛出的是RunTimeException 或 RunTimeException的子类对象,程序员可以不处理该异常,直接交给JVM来处理,此时程序会异常返回非零值(如果自己在编译之前就已经发觉了程序可能存在的运行时异常,也可以自己处理)。

               ④ 如果抛出的是编译时异常,程序员必须自己处理,否则无法通过编译(可以不在所在的方法中处理,此时在所在的方法声明后面加上throws xxx即可,这样操作后可以在调用该方法的方法中再去处理被调用方法存在的异常)。

               ⑤ 一旦有异常抛出,try中其后面的代码将不会被执行(处理完异常后也不会被执行了)

               ⑥ Throwable类的构造方法有带参数的和不带参数的,它的所有子类中也有带参数和不带参数的构造方法,因此在抛出异常对象时可以传参。

2.4 捕获处理异常

1. 在方法中如果出现了编译型异常(此异常不能交给JVM) 或 出现了运行时异常但想自己手动处理,要么直接在所在方法中处理(通过try-catch-finally去处理),要么在所在方法的声明后面加上throws xxxException,意思相当于我先不在本方法中处理这个异常,哪个方法调用这个方法,哪个方法就去负责处理被调用方法中存在的异常(此时也是通过try-catch-finally去处理的),对于编译型异常,如果在调用方法中放任不管仍然会报错,如果在调用方法的声明后面也加上了throws xxxException,则被调用方法中的异常会被交给JVM处理,但JVM不会处理编译型异常,最终会导致程序直接崩溃,异常返回。

2. 语法格式: 修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2...{ }

3. 注意:① throws必须跟在方法的参数列表之后。

               ② throws后面声明的异常必须是Exception 或 Exception的子类。

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

               ④ 调用有声明异常的方法时,调用者必须对被调用方法存在的异常进行处理,或者继续使用throws抛出异常。

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

4. try-catch-finally处理异常:

注意:① try块内抛出异常位置之后的代码将不会被执行,一个try-catch-finall语句只能捕捉和处理一个异常,处理完一个异常完后,try后面的代码也不会被执行了。

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

           ③ try中可能会抛出多个不同的异常对象,则必须用多个catch来捕获。这句话是说try中可能会出现多种异常的情况,但具体出现哪种或哪几种在实际开发中并不是都能精准预判到的,例如前端传给后端数据时,你也不知道传来的东西会不会成功引发某种异常,所以你在catch时把try中所有可能会出现的异常都写上,不过注意,try-catch-finally只能处理一次异常,try存在的其他异常将不会去处理,程序执行完finally就跳出当前的try-catch-finally了。

           ④ 如果多个异常的处理方式是完全相同, 也可以写成这样:

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

           ⑥ 可以通过一个catch捕获所有的异常,即多个异常使用Exception一次捕获(但这种方法不推荐)。

           ⑦ : catch 进行类型匹配的时候, 不光会匹配相同类型的异常对象, 也会捕捉目标异常类型的子类对象.。

2.5 finally存在的意义

1. 在写程序时,有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源:网络连接、数据库 连接、IO流等,在程序正常或者异常退出时,必须要对资源进行回收,另外,因为异常会引发程序的跳转,可能导致有些语句执行不到,finally就是用来解决这个问题的。(总之咯,如果你使用try-catch-去捕获和处理异常,如果正常捕获或处理了还好说,此时程序会跳出try-catch语句块,执行程序后面的代码(含对资源回收的代码),但如果没有正常捕获到try中具有的异常,那么此时所存在的异常就会被向上传递,一直到 main 方法也没有合适的代码处理异常的话, 就会交给 JVM 来进行处理, 此时程序就会异常终止,因而会导致try-catch-finally后边的代码将不会被执行到,即资源回收的代码将不会被执行到,综上,于是就有了finally存在的意义,我们会把对资源进行回收、有些可能执行不到的语句写在finally里面而不是try-catch-finally外面)

2. 注意:① finally中的代码一定会执行的,一般在finally中进行一些资源清理的扫尾工作。

               ② finally 执行的时机是在方法返回之前 (try 或者 catch 中如果有 return 会在这个 return 之前执行 finally),但是如果 finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return。 一般我们不建议在 finally 中写 return (被编译器当做一个警告)。

2.6 异常处理流程总结

① 程序先执行 try 中的代码。

② 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.

③ 如果找到匹配的异常类型, 就会执行 catch 中的代码。

④ 如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者。

⑤ 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行)。

⑥ 如果上层调用者也没有处理的了异常, 就继续向上传递。

⑦ 一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止。

2.7 自定义异常类

1. 具体方式:① 自定义异常类,然后继承自Exception 或者 RunTimeException

                  ② 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因

2. 注意事项:自定义异常通常会继承自 Exception 或者 RuntimeException,其中继承自 Exception 的异常默认是受查异常,继承自 RuntimeException 的异常默认是非受查异常。

3. 自定义示例:

本篇已完结 ......

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

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

相关文章

【日常记录】【JS】JS中查询参数处理工具URLSearchParams

文章目录 1. 引言2. URLSearchParams2.1 URLSearchParams 的构造函数2.2 append() 方法2.3 delete() 方法2.4 entries() 方法2.5 forEach() 方法2.6 get() 方法2.7 getAll() 方法2.8 has() 方法2.9 keys() 方法2.10 set() 方法2.11 toString() 方法2.12 values() 方法 参考链接…

Protobuf序列化原理学习

Protobuf 序列化原理学习 1. 基本概念 消息:由于Protocp Buffer主要用于数据存储、网络通信的场景,将结构化的数据(数据结构或对象)进行序列化,生成二进制串来保存或传输。把要序列化的结构化数据称为**消息**。 T -…

Activiti学习之入门个人任务(07)

这里写目录标题 一、分配任务负责人1.1 固定分配1.2 表达式分配1.2.1 UEL表达式1.2.2 使用流程变量分配任务1.2.3 注意事项 1.3 监听器分配 二、查询任务2.1 查询负责人待办2.2 关联businessKey 三、办理任务 一、分配任务负责人 1.1 固定分配 在进行业务流程建模时指定固定的…

vdb:虚拟数据库

将文件虚拟成数据库,序列化写入、反序列化读取、直接读取。

离散型制造业中,MES系统的应用场景

在离散型制造业中,MES(制造执行系统)系统的应用场景极为丰富且关键,它贯穿于整个生产过程的各个环节,从生产计划到生产执行,再到质量控制和物料管理,都发挥着不可替代的作用。以下是离散制造业中…

本地化部署一个简单的AI大模型,Llama3.1

7 月 23 日消息,Meta 今晚正式发布llama3.1,提供 8B、70B 及 405B 参数版本。 Meta 称 4050 亿参数的 Llama 3.1-405B 在常识、可引导性、数学、工具使用和多语言翻译等一系列任务中,可与 GPT-4、GPT-4o、Claude 3.5 Sonnet 等领先的闭源模型…

收藏:高性价比https证书

在当今的数字化世界中,网络安全已经成为了每个网站所有者的首要关注点,为了保护网站的安全,防止数据被窃取或篡改,使用SSL证书已经成为了一种标准的做法,SSL证书是一种用于加密网站和用户之间数据传输的证书&#xff0…

[240726] Mistral AI 发布新一代旗舰模型 | Node.js 合并 TypeScript 文件执行提案

目录 Mistral AI 发布新一代旗舰模型:Mistral Large 2Node.js 合并 TypeScript 文件执行提案:--experimental-strip-types Mistral AI 发布新一代旗舰模型:Mistral Large 2 Mistral AI 宣布推出新一代旗舰模型 Mistral Large 2,该…

2024新版 黑马程序员《C++零基础入门》笔记——第一章19 cin中文乱码的解决

1.cin中文乱码的解决 2.代码实践 # include "iostream" # include "windows.h" using namespace std;int main() {SetConsoleOutputCP(CP_UTF8);string str;cin >> str;cout << str << endl;return 0; } 注意&#xff0c;勾选之后以后也…

【echarts】中如何设置曲线展示最新值、最大值、最小值

需要用到的属性&#xff1a;图表标注 series-line. markPoint 默认可以通过 type直接标注&#xff1a;‘min’ 最小值、‘max’ 最大值、‘average’ 平均值。 markPoint: {data: [{type: max},{type: min}]}如何展示最新值 如果要展示最新值得话&#xff0c;需要设置 标注…

如何让C++程序自动生成dump文件?以及如何分析dump文件?

目录 1、API函数SetUnhandledExceptionFilter介绍 2、调用SetUnhandledExceptionFilter设置异常处理函数 3、调用MiniDumpWriteDump函数导出包含异常上下文的dump文件 4、dump文件的多种生成方式 5、使用Windbg分析dump文件 6、最后 C++软件异常排查从入门到精通系列教程…

数业智能心大陆:定制你的专属心理健康方案

在快速变化的社会中&#xff0c;随着人们对自我健康认识的不断加深&#xff0c;心理健康已成为影响生活质量的关键因素&#xff0c;许多成年人在其一生中会遇到心理健康问题。在探索人类心理奥秘的旅程中&#xff0c;我们发现&#xff0c;每个人的心理状态和需求都是独一无二的…

mmdetection训练后评估指标,验证Loss

项目场景&#xff1a; 对mmdetection框架下训练好的log.json文件进行评估。 问题描述 使用框架底下自带的评估文件&#xff0c;不能对loss进行评估。也就是文件&#xff1a;tools/analysis_tools/analyze_logs.py 解决方案&#xff1a; 自己做了评估loss的代码&#xff0c;目…

使用nginx解决本地环境访问线上接口跨域问题

前言 前端项目开发过程中&#xff0c;经常会遇到各种各样的跨域问题。 虽然大部分时候&#xff0c;由脚手架自带的proxy功能即可解决问题&#xff0c;如webpack&#xff0c;vite等&#xff1b;但是若没有通过脚手架搭建项目&#xff0c;或者必须使用某些特殊规则转发时&#…

C语言常见字符函数和字符串函数精讲

目录 引言 一、字符函数 1.字符分类函数 2.字符转换函数 二、字符串函数 1.gets、puts 2.strlen 3.strcpy 4.strncpy 5.strcat 6.strncat 7.strcmp 8.strncmp 9.strstr 10.strchr 11.strtok 12.strlwr 13.strupr 引言 在C语言编程中&#xff0c;字符函数…

Python小工具——监听某网站的数据变化并进行邮件通知

目录 一、需求描述 二、解析 三、实例代码 一、需求描述 监听自考网2024年广东省6月份的毕业生学历注册进度&#xff0c;这是网址&#xff1a;https://www.chsi.com.cn/xlcx/count_zk.jsp&#xff0c; 如上图所示&#xff0c;我们想知道这个红色的空格啥时候被填满&#xf…

Linux下使用gdb进行调试入门级

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

linux modetest常用命令

1 通过help有哪些参数 130|:/ # modetest -h usage: modetest [-acDdefMPpsCvrw]Query options:-c list connectors-e list encoders-f list framebuffers-p list CRTCs and planes (pipes)Test options:-P <plane_id><crtc_id>:<w>x&l…

主机加固|防勒索病毒|产线工控安全

在当今数字化转型的大潮中&#xff0c;工业控制系统&#xff08;ICS&#xff09;作为制造业的核心命脉&#xff0c;其安全性与稳定性直接关系到企业的生产效率和运营安全。然而&#xff0c;随着网络攻击手段的不断进化&#xff0c;尤其是勒索病毒的肆虐&#xff0c;工控安全已成…

ctfshow 框架复现 工具版

工具 首先下载工具PHPGGC GitHub地址 ./phpggc -lweb466 Laravel5.4 是这个版本的漏洞那么我们去看看那个poc链是这个版本的 Laravel/RCE2可以 命令 ./phpggc -i Laravel/RCE2 题目提示要base64编码提交 ./phpggc Laravel/RCE2 system ls /|base64成功RCE https://31…