【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.mzph.cn/news/156927.shtml

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

相关文章

【C++进阶之路】第七篇:异常

文章目录 一、C语言传统的处理错误的方式二、 C异常概念三、异常的使用1.异常的抛出和捕获2.异常的重新抛出3.异常安全4.异常规范 四、自定义异常体系五、C标准库的异常体系&#xff08;了解&#xff09;六、异常的优缺点 一、C语言传统的处理错误的方式 传统的错误处理机制&am…

java中,通过替换word模板中的关键字后输出一个新文档

一、要用到的jar包 我已上传了相关的jar包&#xff0c;需要的可以通过以下链接直接下载&#xff1a; https://download.csdn.net/download/qq_27387133/88558034 具体jar包截图&#xff1a; 二、实现的代码 注意&#xff1a;文件要用docx格式!!! word变量替换的方法&#…

场景驱动的 AI 体验设计:如何让智能 IDE 赋能遗留系统重写

作为 AutoDev 的核心开发&#xff0c;我们不仅在不断丰富 AutoDev 的功能以满足不同公司的定制需求&#xff0c;还在与各种团队进行持续交流。在处理遗留系统时&#xff0c;我们发现程序员们日常工作中需要面对大量使用过时技术、基础设施混乱的系统。 在这个背景下&#xff0c…

leetcode:20. 有效的括号

一、题目&#xff1a; 链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;bool isValid(char* s) 二、思路&#xff1a; 利用栈来解这道题会方便许多&#xff1a; 遍历字符串s&#xff0c;当遇到左括号就将其压入栈中&#xff1b;遇…

局域网无法上网主机通过TinyProxy代理主机访问公网Internet

1.代理主机搭建: 系统:ubuntu 网卡:2个 运行于 VMWare上 第一个网卡用于NAT 第二个网卡用于私有网络 两个IP如下: 192.168.31.243为NAT可访问Internet 192.168.144.141属于私有网络,用于访问局域网 安装tinyproxy sudo apt install tinyproxy 查看服务状态

webAPI serial——串口连称

重点 关闭正在读的串口 借鉴文章:webapi串口 async closeport() {this.$emit("changeSerialStatus", false);//这里要注意&#xff0c;一定要关闭读取this.status false;//取消后&#xff0c;done会变成true&#xff0c;会执行reader.releaseLock();this.reader.c…

git常常用命令

这篇文章中&#xff0c;一些简单的&#xff0c;大家都知道的git 命令我就不再赘述&#xff0c;我只写出来最近在项目中常用到的一些命令。这些命令可以帮助我更好的开发。 git stash 请大家设想下面的场景&#xff0c;你的本地有两个分支&#xff0c;develop,fix分支&#xf…

禁止linux shell 终端显示完整工作路径,如何让linux bash终端不显示当前工作路径

在操作linux时&#xff0c;默认安装的linux终端会显示当前完整的工作目录&#xff0c;如果目录比较短还是可以接收&#xff0c;如果目录比较长&#xff0c;就显得比较别扭&#xff0c;操作起来不方便&#xff0c;因此需要关闭这种功能。 要关闭这个功能&#xff0c;请按如下步骤…

智能座舱架构与芯片- (11) 软件篇 上

一、智能汽车基础软件平台分类 汽车软件主要分为应用软件和基础软件。应用软件和业务形态高度关联&#xff0c;不同控制器的应用软件之间差异较大。基础软件介于应用软件和硬件之间&#xff0c;用于屏蔽硬件特性、支撑应用软件。可有效地实现应用软件与硬件之间解耦&#xff0…

ky10 server x86 安装、更新openssl3.1.4(在线编译安装、离线安装)

查看openssl版本 openssl version 离线编译安装升级 #!/bin/shOPENSSLVER3.1.4OPENSSL_Vopenssl versionecho "当前OpenSSL 版本 ${OPENSSL_V}" #------------------------------------------------ #wget https://www.openssl.org/source/openssl-3.1.4.tar.gzech…

【Python】学习Python面向对象编程的疑问

&#xff08;Java菜鸟来学Python了&#xff09; &#x1f914; 1. 静态方法与类方法什么区别&#xff1f; 实例方法只能被实例对象调用(Python3 中&#xff0c;如果类调用实例方法&#xff0c;需要显示的传self, 也就是实例对象自己)&#xff0c;静态方法(由staticmethod装饰…

LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型

根据图片生成推广文案&#xff0c; 用的HuggingFace中的image-caption模型 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数…

STM32 寄存器配置笔记——系统时钟配置 HSE as PLL

一、概述 本文主要介绍使用HSE高速外部时钟通过PLL倍频输出72MHZ的时钟作为系统时钟。下图为时钟树。 使用正点原子的开发板调试OSC_IN、OSC_OUT接的是8MHZ的晶振即为HSE时钟。 二、配置流程 1&#xff09;复位RCC相关的所有寄存器 复位内容是参考正点原子例程&#xff0c;按照…

云计算:开辟数字时代的无限可能

云计算是一项革命性的技术&#xff0c;为企业和个人提供了灵活、可扩展和高效的计算资源。本文将介绍云计算的概念、架构和优势&#xff0c;并探讨其在数字化时代的重要性和未来发展趋势。 引言 随着信息技术的日新月异和数字化转型的浪潮席卷全球&#xff0c;云计算作为一种颠…

多元函数奇偶性

多元函数奇偶性 多元函数的定义域 定义域根据函数的变量数不同,有不同的形式 一元函数 y f ( x ) yf(x) yf(x),定义域可以是数集二元函数 z f ( x , y ) zf(x,y) zf(x,y),定义域可以是一平面区域,是平面点集三元函数 v f ( x , y , z ) vf(x,y,z) vf(x,y,z),定义域是一块空…

ZYNQ_project:lcd_pic_400x400

在lcd液晶屏上显示400x400像素的图片&#xff0c; 像素信息通过电脑的串口调试助手&#xff0c;发送给fpga&#xff0c;存储在例化的双端口ram中&#xff0c; 在要显示图像区域&#xff0c;读取ram中的像素信息。 模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a;…

O-Star|再相识

暑去秋来&#xff0c;岁月如梭&#xff0c;几名"O-Star"们已经入职一段时间&#xff0c;在这期间他们褪去青涩&#xff0c;逐渐适应了公司的工作环境和文化&#xff0c;迈向沉稳&#xff5e; 为了进一步加深校招生之间的交流与了解&#xff0c;提高校招生的凝聚力和…

gitlab

Gitlab 安装git yum安装 [rootgit ~]# yum -y install git编译安装 Git官网 #安装依赖关系 [rootgit ~]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf gcc perl-ExtUtils-MakeMaker # 编译安装 [rootgit ~]# tar -zxf git-2.0…

基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

目录 一、前言 二、源码分析 三、负载均衡策略 一、前言 如下图&#xff0c;我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求&#xff0c;在服务拉取的时候&#xff0c;主机名 localhost 是用服务名 userserver 代替的&#xff0c;那么该 url 是一个可…

Java动态代理JKD版本

1、ISale.java package com.atguigu; public interface ISale {void saleShaoBing();void saleJianBing();void saleYueBing();void saleManTou(); }2、WuDa.java package com.atguigu;//Target:目标类、目标对象 public class WuDa implements ISale{//target method:目标方法…