【Java】异常处理及其语法、抛出异常、自定义异常(完结)

🌺个人主页:Dawn黎明开始

🎀系列专栏:Java
每日一句:道阻且长,行则将至

📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️


文章目录

一.🔐异常处理及其语法

📋前言

1.1🔓try...catch语句

 1.1.1🔑语法格式

1.1.2🔑注意事项

1.1.3🔑异常处理流程

1.1.4🔑案例演示

1.2🔓finally语句

 1.2.1🔑语法格式

1.2.2🔑异常处理流程

1.2.3🔑案例演示

二.🔐抛出异常

📋前言

2.1🔓throws关键字

2.1.1🔑语法格式

2.1.2🔑案例演示1

2.1.3🔑案例演示2

2.1.4🔑案例演示3

2.2🔓throw关键字

2.2.1🔑语法格式

2.2.2🔑throw关键字抛出异常

2.2.3🔑案例演示

三.🔐自定义异常类

3.1🔑自定义异常示例代码

3.2🔑案例演示1

3.3🔑案例演示2

📝全文总结


 

一.🔐异常处理及其语法

📋前言

       在Java中,通过trycatchfinallythrowthrows这5个关键字进行异常对象的处理。具体说明如下所示。

1.1🔓try...catch语句

1.1.1🔑语法格式

      为了使发生异常后的程序代码正常执行,程序需要捕获异常并进行处理,Java提供了try…catch语句用于捕获并处理异常。try…catch语句的语法格式如下所示:

try{             

       代码块 

} catch(ExceptionType e){              

       代码块

1.1.2🔑注意事项

 (1)try代码块是必需的。

 (2)catch代码块和finally代码块都是可选的,但catch代码块和finally代码块至少要出现一个。 

 (3)catch代码块可以有多个,但捕获父类异常的catch代码块必须位于捕获子类异常的catch代码块后面。

 (4)catch代码块必须位于try代码块之后。

1.1.3🔑异常处理流程

       由上图可知,程序通过try语句捕获可能出现的异常,如果try语句没有捕获到异常,则直接跳出try…catch语句块执行其他程序;如果在try语句中捕获到了异常,则程序会自动跳转到catch语句中找到匹配的异常类型进行相应的处理。异常处理完毕,最后执行其他程序语句。

1.1.4🔑案例演示

      下面通过一个案例使用try…catch语句对异常进行捕获,在本案例中,计算 以0为除数的表达式,运行程序并观察程序的运行结果。

代码如下👇🏻

package Exa;public class Example02 {public static void main(String[] args) {       try {                               int result = divide(4, 0);    //调用divide()方法System.out.println(result);   } catch (Exception e) {            //对异常进行处理System.out.println("捕获的异常信息为:" + e.getMessage());}System.out.println("程序继续向下执行...");}//下面的方法实现了两个整数相除public static int divide(int x, int y) { int result = x / y;    //定义一个变量result记录两个数相除的结果return result;                 //将结果返回}
}

运行结果👇🏻

注意:在try代码块中,发生异常语句后面的代码是不会被执行的,如上述案例中第5行 代码的打印语句就没有执行。

1.2🔓finally语句

 1.2.1🔑语法格式

     在程序中,有时候会希望一些语句无论程序是否发生异常都要执行,这时就可以在try…catch语句后,加一个finally代码块。

try{    

     代码块

} catch(ExceptionType e){    

     代码块

}  finally{    

     代码块

}

注意:finally代码块必须位于所有catch代码块之后。

1.2.2🔑异常处理流程

      由上图可知,在try…catch…finally语句中,不管程序是否发生异常,finally代码块中的代码都会被执行。需要注意的是,如果程序发生异常但是没有被捕获到,在执行完finally代码块中的代码之后,程序会中断执行。

1.2.3🔑案例演示

     下面通过一个案例演示try…catch...finally语句块的使用。

代码如下👇🏻

package Exa;public class Example03 {public static void main(String[] args) {//下面的代码定义了一个try…catch…finally语句用于捕获异常
try {
int result = divide(4, 0);       //调用divide()方法
System.out.println(result);
} catch (Exception e) {               //对捕获到的异常进行处理
System.out.println("捕获的异常信息为:" + e.getMessage());return;                      //用于结束当前语句
} finally {                             
System.out.println("进入finally代码块");
}System.out.println("程序继续向下…");
}
//下面的方法实现了两个整数相除
public static int divide(int x, int y) {
int result = x / y;           //定义一个变量result记录两个数相除的结果
return result;                 //将结果返回
}}

运行结果👇🏻

注意:如果在try...catch中执行了System.exit(0)语句,finally代码块不再执行。 System.exit(0)表示退出当前的Java虚拟机,Java虚拟机停止了,任何代码都不能再执行了。

二.🔐抛出异常

📋前言

     在实际开发中,大部分情况下我们会调用别人编写的方法,并不知道别人编写的方法是否会发生异常。针对这种情况,Java允许在方法的后面使用throws关键字声明该方法有可能发生的异常,这样调用者在调用方法时,就明确地知道该方法有异常,并且必须在程序中对异常进行处理,否则编译无法通过。

2.1🔓throws关键字

2.1.1🔑语法格式

修饰符 返回值类型 方法名(参数1,参数2,…)throws 异常类1, 异常类2...{        

             方法体

}

   throws关键字需要写在方法声明的后面,throws后面还需要声明方法中发生异常的类型。

2.1.2🔑案例演示1

代码如下👇🏻

package Exa;public class Example04 {public static void main(String[] args) {int result = divide(4, 2);    //调用divide()方法System.out.println(result);}//下面的方法实现了两个整数相除,并使用throws关键字声明抛出异常public static int divide(int x, int y) throws Exception {int result = x / y;   //定义一个变量result记录两个数相除的结果return result;         //将结果返回}
}

运行结果👇🏻

分析

      第4行代码调用divide()方法时传入的第2个参数为2,程序在运行时不会发生被0除的异常。但是运行程序依然会提示错误,这是因为定义divide()方法时使用throws关键字声明了该方法可能抛出的异常,调用者必须在调用divide()方法时对抛出的异常进行处理,否则就会发生编译错误。

2.1.3🔑案例演示2

    下面对案例演示1修改,使用try…catch语句处理divide()方法抛出异常。 

代码如下👇🏻

package Exa;public class Example05 {public static void main(String[] args) {//下面的代码定义了一个try…catch语句用于捕获异常try {int result = divide(4, 2);   //调用divide()方法System.out.println(result); } catch (Exception e) {                 //对捕获到的异常进行处理e.printStackTrace();   //打印捕获的异常信息}}//下面的方法实现了两个整数相除,并使用throws关键字声明抛出异常public static int divide(int x, int y) throws Exception {int result = x / y;    //定义一个变量result记录两个数相除的结果return result;          //将结果返回}
}

运行结果👇🏻 

 注意:使用throws关键字重抛异常时,如果程序发生了异常,并且上一层调用者也无法 处理异常时,那么异常会继续被向上抛出,最终直到系统接收到异常,终止程序执行。

2.1.4🔑案例演示3

      下面修改案例演示2,将divide()方法抛出的异常继续抛出。

代码如下👇🏻

package Exa;public class Example06 {public static void main(String[] args)throws Exception {int result = divide(4, 0);   // 调用divide()方法System.out.println(result);}// 下面的方法实现了两个整数相除,并使用throws关键字声明抛出异常public static int divide(int x, int y) throws Exception {int result = x / y;   // 定义一个变量result记录两个数相除的结果return result;         // 将结果返回}
}

运行结果👇🏻  

分析

     在案例演示3中,main()方法继续使用throws关键字将Exception抛出,程序虽然可以通过编译,但从上图的运行结果可以看出,在运行时期由于没有对“/by zero”的异常进行处理,最终导致程序终止运行。 

2.2🔓throw关键字

     在Java程序中,除了throws关键字,还可以使用throw关键字抛出异常。与throws关键字不同的是,throw关键字用于方法体内,抛出的是一个异常实例,并且每次只能抛出一个异常实例。

2.2.1🔑语法格式

throw ExceptionInstance;

     在方法中,通过throw关键字抛出异常后,还需要使用throws关键字或try…catch对异常进行处理。如果throw抛出的是error、RuntimeException或它们的子类异常对象,则无需使用throws关键字或try…catch对异常进行处理。

2.2.2🔑throw关键字抛出异常

使用throw关键字抛出异常,通常有如下两种情况。

(1)当throw关键字抛出的异常是编译时异常时,第一种处理方式是在try代码块里使用throw关键字抛出异常,通过try代码块捕获该异常;第二种处理方式是在一个有throws声明的方法中使用throw关键字抛出异常,把异常交给该方法的调用者处理。

(2)当throw关键字抛出的异常是运行时异常时,程序既可以显式使用try…catch捕获并处理该异常,也可以完全不理会该异常,而把该异常交给方法的调用者处理。

2.2.3🔑案例演示

       下面通过一个案例讲解throw关键字的使用。

代码如下👇🏻

package Exa;public class Example07 {public static void main(String[] args)  {// 下面的代码定义了一个try…catch语句用于捕获异常int age = -1;     try {printAge(age);} catch (Exception e) {  // 对捕获到的异常进行处理System.out.println("捕获的异常信息为:" + e.getMessage());}
}// 定义printAge()输出年龄public static void printAge(int age) throws Exception {if(age <= 0){// 对业务逻辑进行判断,当输入年龄为负数时抛出异常throw new Exception("输入的年龄有误,必须是正整数!");}else {System.out.println("此人年龄为:"+age);}}}

 运行结果👇🏻  

三.🔐自定义异常类

📋前言

     Java中定义了大量的异常类,虽然这些异常类可以描述编程时出现的大部分异常情况,但是在程序开发中有时可能需要描述程序中特有的异常情况。例如,两数相除,不允许被除数为负数。此时,就无法使用Java提供的异常类表示该类异常,为了解决这个问题,Java允许用户自定义异常类,自定义的异常类必须继承自Exception或其子类

3.1🔑自定义异常示例代码

自定义异常类的代码如下👇🏻

package Exa;public class DivideByMinusException extends Exception{public DivideByMinusException (){super();          	// 调用Exception无参的构造方法}public DivideByMinusException (String message){super(message); 	// 调用Exception有参的构造方法}
}

     在实际开发中,如果没有特殊的要求,自定义的异常类只需继承Exception类,在构造方法 中使用super()语句调用Exception的构造方法即可。

     使用自定义的异常类,需要用到throw关键字。使用throw关键字在方法中声明异常的实例 对象,语法格式如下:

throw Exception 异常对象

3.2🔑案例演示1

     修改divide()方法,在divide()方法中判断被除数是否为负数,如果为负数,就使用throw关键字在方法中向调用者抛出自定义的DivideByMinusException异常对象。

package Exa;public class Example08 {public static void main(String[] args) {int result = divide(4, -2);           System.out.println(result);}//下面的方法实现了两个整数相除public static int divide(int x, int y) {if(y<0){ throw new DivideByMinusException("除数是负数");	}int result = x / y;   // 定义一个变量result记录两个数相除的结果return result;         // 将结果返回}
}

 

        从上图可以看出,程序在编译时就发生了异常。因为在一个方法内使用throw关键字抛出异常对象时,需要使用try…catch语句对抛出的异常进行处理,或者在divide()方法上使用throws关键字声明抛出异常,由该方法的调用者负责处理。但是案例一没有这样做。为了解决上图中出现的问题,对案例演示1进行修改,请看案例演示2。

3.3🔑案例演示2

      修改案例演示1,在divide()方法上,使用throws关键字声明该方法抛出DivideByMinusException异常,并在调用divide()方法时使用try…catch语句对异常进行处理。

代码如下👇🏻

package Exa;public class Example09 {public static void main(String[] args) {// 下面的代码定义了一个try…catch语句用于捕获异常try {int result = divide(4, -2);  		System.out.println(result);} catch (DivideByMinusException e) {     // 对捕获到的异常进行处理System.out.println(e.getMessage()); // 打印捕获的异常信息}}// 下面的方法实现了两个整数相除,并使用throws关键字声明抛出自定义异常public static int divide(int x, int y) throws DivideByMinusException{if (y < 0) {throw new DivideByMinusException("除数是负数");}int result = x / y;  // 定义一个变量result记录两个数相除的结果return result;        // 将结果返回}}

运行结果👇🏻 

📝全文总结

           本文主要介绍了异常的处理及语法抛出异常,最后介绍了自定义异常。通过本文的学习,希望大家对Java中的异常会有一定的了解,掌握好这些知识,对以后的实际开发大有裨益。 

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

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

相关文章

Java,数据结构与集合源码,数据结构概述

目录 数据结构概念&#xff1a; 数据结构的研究对象&#xff1a; 研究对象一&#xff0c;数据间逻辑关系&#xff1a; 研究对象二&#xff0c;数据的存储结构&#xff08;或物理结构&#xff09;&#xff1a; 研究对象三&#xff1a;运算结构 数据结构的相关介绍&#xff…

maven pom引入依赖不报红,但是项目Dependencies中没有引入jar包

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01; 也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&…

vue中data属性为什么是一个函数?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-data属性 目录 为什么data属性是一个函数而不是一个对象&#xff1f; 一、实例和组件定义dat…

Apache Airflow (十三) :Airflow分布式集群搭建及使用-原因及

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

U4_1:图论之DFS/BFS/TS/Scc

文章目录 一、图的基本概念二、广度优先搜索&#xff08;BFS&#xff09;记录伪代码时间复杂度流程应用 三、深度优先搜索&#xff08;DFS&#xff09;记录伪代码时间复杂度流程时间戳结构BFS和DFS比较 四、拓扑排序一些概念有向图作用拓扑排序 分析伪代码时间复杂度彩蛋 五、强…

复杂数据统计与R语言程序设计实验一

1.下载并安装R语言软件&#xff0c;熟悉基本操作的命令及操作界面&#xff0c;掌握软件的使用方法&#xff08;提供学号加姓名的截图&#xff09;。 2.下载并安装Rstudio&#xff0c; &#xff08;提供运行代码及运行结果的截图&#xff09;。 3.下载并安装R包DT&#xff0c;…

树莓派的的串口通信协议

首先&#xff0c;回顾一下串口的核心知识点&#xff0c;也是面试重点&#xff1a; 串口通信通常使用在多机通讯中串口通信是全双工的决定串口通信的成功与否的是 数据格式 和 波特率数据格式&#xff1a;1. 数据位 2.停止位 3. 奇偶校验位 树莓派恢复串口 回忆前几节树莓派刷机…

Tensorrt 实现 yolov5-cls 遇到的问题

yolov5-6.2增加了分类训练、验证、预测和导出&#xff08;所有 11 种格式&#xff09;&#xff0c;还提供了 ImageNet 预训练的 YOLOv5m-cls、ResNet&#xff08;18、34、50、101) 和 EfficientNet (b0-b3) 模型. 官方Git : https://github.com/ultralytics/yolov5 分类模型与…

企业微信将应用安装到工作台

在上篇中介绍了配置小程序应用及指令、数据回调获取第三方凭证&#xff1b; 本篇将介绍如何将应用安装到企业工作台。 添加测试企业 通过【应用管理】->【测试企业配置】添加测试企业。 通过企业微信扫描二维码添加测试企业。 注意&#xff1a;需要扫描的账号为管理员权限…

4.Gin HTML 模板渲染

4.Gin HTML 模板渲染 Gin HTML 模板渲染 1. 全部模板放在一个目录里面的配置方法 创建用于渲染的模板html templates/index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> …

【云原生-Kurbernetes篇】HPA 与 Rancher管理工具

文章目录 一、Pod的自动伸缩1.1 HPA1.1.1 简介1.1.2 HPA的实现原理1.1.3 相关命令 1.2 VPA1.2.1 简介1.2.2 VPA的组件1.2.3 VPA工作原理 1.3 metrics-server简介 二、 HPA的部署与测试2.1 部署metrics-serverStep1 编写metrics-server的配置清单文件Step2 部署Step3 测试kubect…

数学几百年重大错误:将两异函数误为同一函数

黄小宁 因各实数都可是数轴上点的坐标所以数集A可形象化为数轴上的点集A&#xff0c;从而使x∈R变换为实数yxδ的几何意义可是&#xff1a;一维空间“管道”g内R轴上的质点x∈R(x是点的坐标)运动到新的位置yxδ还在管道g内&#xff08;设各点只作位置改变而没别的改变即变位前…

『亚马逊云科技产品测评』活动征文|搭建Squoosh图片在线压缩工具

搭建Squoosh图片在线压缩工具 前言一、Squoosh是什么&#xff1f;二、准备一台Lightsail实例1.进入控制台2.创建实例3.开放端口4.部署Squoosh5.预览 三、搭建反向代理1. 安装宝塔2. 配置反向代理3. 预览代理效果 提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马…

2021秋招-总目录

2021秋招-目录 知识点总结 预训练语言模型: Bert家族 1.1 BERT、attention、transformer理解部分 B站讲解–强烈推荐可视化推倒结合代码理解代码部分常见面试考点以及问题: word2vec 、 fasttext 、elmo;BN 、LN、CN、WNNLP中的loss与评价总结 4.1 loss_function&#xff1…

linux rsyslog综合实战2

本次我们通过rsyslog服务将A节点服务器上的两个(E.g:多个日志也可以)日志(Path:/var/log/245-1.log、245-2.log)实时同步到B节点服务器目录下(Path:/opt/rsyslog/245) 1.rsyslog架构 2.环境信息 环境信息 HostnameIpAddressOS versionModuleNotersyslog1192.168.10.245CentOS…

激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

SPASS-指数平滑法

基本概念及统计原理 基本概念 指数平滑法的思想来源于对移动平均预测法的改进。指数平滑法的思想是以无穷大为宽度&#xff0c;各历史值的权重随时间的推移呈指数衰减&#xff0c;这样就解决了移动平均的两个难题。 统计原理 简单模型 Holt线性趋势模型 案例 为了研究上海市…

HarmonyOS ArkTS List组件和Grid组件的使用(五)

简介 ArkUI提供了List组件和Grid组件&#xff0c;开发者使用List和Grid组件能够很轻松的完成一些列表页面。常见的列表有线性列表&#xff08;List列表&#xff09;和网格布局&#xff08;Grid列表&#xff09;&#xff1a; List组件的使用 List是很常用的滚动类容器组件&…

Ghidra逆向工具配置 MacOS 的启动台显示(Python)

写在前面 通过 ghidra 工具, 但是只能用命令行启动, 不太舒服, 写个脚本生成 MacOS 的 app 格式并导入启动台. 不算复杂, 主要是解析包的一些元信息还有裁剪软件图标(通过 MacOS 自带的 API) 脚本 #!/opt/homebrew/bin/python3import os import re import subprocess as sp…

易航网址引导系统 v1.9 源码:去除弹窗功能的易航网址引导页管理系统

易航自主开发了一款极其优雅的易航网址引导页管理系统&#xff0c;后台采用全新的光年 v5 模板开发。该系统完全开源&#xff0c;摒弃了后门风险&#xff0c;可以管理无数个引导页主题。数据管理采用易航原创的JsonDb数据包&#xff0c;无需复杂的安装解压过程即可使用。目前系…