Java | 异常处理

目录

一、异常概述

二、异常的抛出与捕捉

2.1 抛出异常

2.2  捕捉异常

2.2.1 try-catch语句块

2.2.2 finally语句块

三、Java常见的异常类

四、自定义异常

五、在方法中抛出异常

5.1 使用throws关键字抛出异常

5.2 使用throw关键字抛出异常

六、运行时异常

七、异常的使用原则


一、异常概述

在Java中,这种在程序运行时可能出现的一些错误称为异常。异常是一个在程序执行期间发生的事件,它中断了正在执行的程序的正常指令流。

package haha;
public class Baulk{public static void main(String[] args) {int result=3/0;System.out.println(result);}
}

程序运行的结果报告发生了算数异常ArithmeticException(根据给出的错误提示可知,发生错误是因为在算术表达式“3/0”中,0作为除数出现),系统不在执行下去,提前结束,这种情况就是所说的异常。

Java是一门面向对象的编程语言,因此异常在Java语言中也是作为类的实例的形式出现的。当某一方法中发生错误时,这个方法会创建一个对象,并且把它传递给正在运行的系统。这个对象就是异常对象。通过异常处理机制,可以将非正常情况下的处理代码与程序的主逻辑分离,即在编写代码主流程的同时在其他地方处理异常

二、异常的抛出与捕捉

在Java中,如果某个方法抛出异常,既可以在当前方法中进行捕捉,而后处理该异常,也可以将异常向上抛出,交由方法调用者来处理。

2.1 抛出异常

异常抛出后,如果不做任何处理,程序就会被终止。例如,将一个字符串转换为整型,可以通过Interger类的parseInt()方法来实现。但如果该字符串不是数字形式,parseInt()方法就会抛出异常,程序将在出现异常的位置终止,不再执行下面的语句。

package haha;
public class Thundering{                        //创建类public static void main(String[] args) {    //主方法String str="lili";                      //定义字符串System.out.println(str+"年龄是:");        //输出的提示信息int age=Integer.parseInt("20L");        //数据类型的转换System.out.println(age);                //输出信息}
}

本实例报出的是NumberFormatException(字符串转换为数字)异常。提示信息“lili年龄是”已经输出,可知该句代码之前并没有异常,而变量age没有输出,可知程序在执行类型转换代码时已经终止。

2.2  捕捉异常

Java语言的异常捕获结构由try、catch和finally3部分组成。其中try语句块存放的是可能发生异常的Java语句;catch语句块在try语句块之后,用来激发被捕获的异常;finally语句块是异常处理结构的最后执行部分,无论try语句块中的代码如何退出,都将执行finally语句块。语法如下:

try{//程序代码块
}
catch(Exceptiontype1 e){//对Exceptiontype1的处理
}
catch(Exceptiontype2 e){//对Exceptiontype2的处理
}
...
finally{//程序代码块
}

通过异常处理器的语法可知,异常处理器大致分为try-catch语句块和finally语句块。

2.2.1 try-catch语句块

package haha;
public class Take{                                   //创建类public static void main(String[] args) {try {                                        //try语句块中包含可能出现异常的程序代码String str="lili";                       //定义字符串变量System.out.println(str+"年龄是:");         //输出的信息int age=Integer.parseInt("20L");         //数据类型转换System.out.println(age);                 }catch(Exception e) {                        //catch语句块用来获取异常信息e.printStackTrace();                     //输出异常性质 }System.out.println("program over");          //输出信息}
}

上图中,程序仍然输出最后的提示信息,没有因为异常而终止。在上例中,将可能出现异常的代码用try-catch语句块进行处理,当try语句块中的语句发生异常时,程序就会跳转到catch语句块执行,执行完catch语句块中的程序代码后,将继续执行catch语句块后的其他代码,而不会执行try语句块中发生异常后面的代码。由此可知,Java的异常处理是结构化的,不会因为一个异常而影响整个程序的执行。

2.2.2 finally语句块

完整的异常处理语句一定要包含finally语句,无论程序中有无异常发生,并且无论之前的try-catch语句块是否顺利执行完毕,都会执行finally语句。但是,以下4种特殊情况下,finally块不会被执行:

  • 在finally语句块种发生了异常;
  • 在前面的代码中使用了System.exit()退出程序;
  • 程序所在的线程死亡;
  • 关闭CPU。

三、Java常见的异常类

在Java中,提供了一些异常类用来描述经常发生的异常。其中,有的需要程序员进行捕获处理或声明抛出,有的是由Java虚拟机自动进行捕获处理。

常见的异常类
异常类说明
ClassCastException类型转换异常
ClassNotFoundException未找到相应类异常
ArithmeticException算数异常
ArrayIndexOutOfBoundsException数组下标越界异常
ArrayStoreException数组中包含不兼容的值抛出的异常
SQLException操作数据库异常类
NullPointerException空指针异常
NoSuchFieldException字段未找到异常
NoSuchMethodException方法未找到抛出的异常
NumberFormatException字符串转换为数字抛出的异常
NegativeArraySizeException数组元素个数为负数抛出的异常
StringIndexOutOfBoundsException字符串索引超出范围抛出的异常
IOException输入输出异常
IllegalAccessException不允许访问某类异常
InstantiationException当应用程序试图使用Class类中的NewInstance()方法创建一个类的实例,而指定的类对象无法被实例化,抛出该异常。
EOFException文件已结束异常
FileNotFoundException文件未找到异常

四、自定义异常

使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户只需继承Exception类即可自定义异常类。在程序中使用自定义异常类,大部分可分为以下几个步骤:

(1)创建自定义异常类;

(2)在方法中通过throw关键字抛出异常对象;

(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句块捕获并处理,否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。

(4)在出现异常的方法的调用者中捕获并处理异常。

例:如何创建自定义异常

package haha;
public class MyException extends Exception{              //创建自定义异常,继承Exception类public MyException(String ErrorMessage) {            //构造方法super(ErrorMessage);                             //父类构造方法}
}

字符串ErrorMessage是要输出的错误信息。若想要抛出用户自定义的异常对象,要使用trrow关键字。

例:自定义异常的抛出与捕捉

在项目中创建Tran类,在该类中创建一个带有int型参数的方法avg(),该方法用来检查参数是否小于0或大于100。如果参数小于0或大于100,则通过throw关键字抛出一个MyException异常对象,并在main()方法中捕捉该异常。

package haha;
public class Tran{                             //创建类static int avg(int number1,int number2)throws MyException{        //定义方法,抛出异常if(number1<0||number2<0) {                                    //判断方法中参数是否满足指定条件throw new MyException("不可以使用负数");                       //错误信息}if(number1>100||number2>100) {                                //判断方法中参数是否满足指定条件throw new MyException("数值太大了");                         //错误信息}return (number1+number2)/2;                                   //将参数的平均值返回}public static void main(String[] args) {                          //主方法try {                                                         //try语句块处理可能出现异常的代码int result=avg(102,150);                                  //调用arg()方法System.out.println(result);                               //将avg()方法的返回值输出}catch(MyException e) {System.out.println(e);                                     //输出异常信息}}
}

五、在方法中抛出异常

若某个方法可能会发生异常,但不想再当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。

5.1 使用throws关键字抛出异常

throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常。多个异常可使用逗号分开

package haha;
public class Shoot{                    //创建类static void pop() throws NegativeArraySizeException{//定义方法并抛出NegativeArraySizeException异常int[] arr=new int[-3];          //创建数组}public static void main(String[] args) {       //主方法try {                                      //try语句处理异常pop();                                 //调用pop()方法}catch(NegativeArraySizeException e){System.out.println("pop()方法抛出的异常");  //输出异常信息}}
}

使用throws关键字将异常抛给上一级后,如果不象处理异常,可以继续向上抛出,但最终要有能够处理该异常的代码。

如果是Error类、RuntimeException类或它们的子类,可以不使用throws关键字来声明要抛出的异常,编译仍能顺序通过,但在运行时会被系统抛出。

5.2 使用throw关键字抛出异常

throw关键字通过用于方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即终止,但它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句块。

throw通常用来抛出用户自定义异常。

例:创建自定义异常

package haha;public class MyException extends Exception{          //创建自定义异常类String message;                                 //定义String类型变量public MyException(String ErrorMessagr) {       //父类方法message=ErrorMessagr;                       }public String getMessage() {                    //覆盖getMessage()方法return message;}
}
package haha;
public class Captor{                    //创建类static int quotient(int x,int y)throws MyException{         //定义方法抛出异常if(y<0) {                                               //判断参数是否小于0throw new MyException("除数不能是负数");                 //异常信息}return x/y;                                              //返回值}public static void main(String[] args) {                     //主方法try {                                                    //try语句块包含可能发生异常的语句int result=quotient(3,-1);                           //带哦用方法quotient()}catch(MyException e) {                                  //处理自定义异常System.out.println(e.getMessage());                  //输出异常信息}catch(ArithmeticException e) {                                  //处理ArithmeticException异常System.out.println("除数不能为0");                      //输出提示信息}catch(Exception e) {                                    //梳理其他异常System.out.println("程序发生了其他的异常");                 //输出提示信息}}
}

六、运行时异常

RuntimeException异常是程序运行过程中抛出的异常。Java类库的每个包中都定义了异常类,所有的这些类都是Throwable类的子类,Throwable类派生了两个子类,分别是Exception类和Error类。Error类及其子类用来描述Java运行系统中的内部错误以及资源耗尽的错误,这类错误比较严重。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception类又根据错误发生的原因分为RuntimeException异常和除RuntimeException之外的异常。

七、异常的使用原则

Java异常强制用户去考虑程序的强健性和安全性。异常处理不应用来控制程序的正常流程,其主要作用是捕获程序在运行时发生的异常并进行相应的处理。编写代码处理某个方法可能出现的异常时,可遵循以下几条原则:

  • 在当前方法声明中使用try-catch语句捕获异常;
  • 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类;
  • 如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常。

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

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

相关文章

idea创建SpringBoot项目

项目命名规范 项目名全部小写。包名全部小写。 一、点击 Create New Project 二、选择 Maven 点击Next 三、定义项目名称/组 四、定义项目名称 项目存储路径 五、完成创建 六、配置Maven 没配置之前 配置Maven&#xff1a; File > settings...> Build Execution Deplo…

[保研/考研机试] KY129 简单计算器 浙江大学复试上机题 C++实现

描述 读入一个只包含 , -, *, / 的非负整数计算表达式&#xff0c;计算该表达式的值。 输入描述&#xff1a; 测试输入包含若干测试用例&#xff0c;每个测试用例占一行&#xff0c;每行不超过200个字符&#xff0c;整数和运算符之间用一个空格分隔。没有非法表达式。当一行中…

构建IT项目价值管理体系︱陆金所控股有限公司项目管理专家朱磊

陆金所控股有限公司项目管理专家朱磊先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;陆控-构建IT项目价值管理体系。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; IT资源有限&#xff0c;…

模仿火星科技 基于cesium+水平面积测量+可编辑

​ 当您进入Cesium的编辑水平积测量世界&#xff0c;下面是一个详细的操作过程&#xff0c;帮助您顺利使用这些功能&#xff1a; 1. 创建提示窗&#xff1a; 启动Cesium应用&#xff0c;地图场景将打开&#xff0c;欢迎您进入编辑模式。 在屏幕的一角&#xff0c;一个友好的提…

山西电力市场日前价格预测【2023-08-10】

日前价格预测 预测明日&#xff08;2023-08-10&#xff09;山西电力市场全天平均日前电价为328.01元/MWh。其中&#xff0c;最高日前电价为366.62元/MWh&#xff0c;预计出现在20: 00。最低日前电价为283.28元/MWh&#xff0c;预计出现在13: 15。 价差方向预测 1&#xff1a; 实…

Linux 的基本使用

1、Linux 是什么 Linux 是一个操作系统. 和 Windows 是 "并列" 的关系 Linux 严格意义来说只是一个 "操作系统内核". 一个完整的操作系统 操作系统内核 配套的应用程序. CentOS 和 RedHat 的关系 RedHat一直都提供源代码的发行方式&#xff0c;Cent…

期刊和会议缩写查询网站

1.https://pubmed.ncbi.nlm.nih.gov/?termMedicalImageComputingandComputer-AssistedIntervention 2. http://www.letpub.com.cn/index.php?pagejournalapp&viewsearch 3. https://blog.csdn.net/weixin_44557349/article/details/120825927 https://blog.csdn.net/ret…

\vendor\github.com\godror\orahlp.go:531:19: undefined: VersionInfo

…\goAdmin\vendor\github.com\godror\orahlp.go:531:19: undefined: VersionInfo 解决办法 降了go版本(go1.18)&#xff0c;之前是go1.19 gorm版本不能用最新的&#xff0c;降至&#xff08;gorm.io/gorm v1.21.16&#xff09;就可以 修改交插编译参数 go env -w CGO_ENABLED1…

【Redis】Spring/SpringBoot 操作 Redis Java客户端

目录 操作 Redis Java客户端SpringBoot 操作Redis 步骤 操作 Redis Java客户端 1.Jedis 2.Lettuce(主流) <-Spring Data Redis SpringBoot 操作Redis 步骤 1.添加Redis 驱动依赖 2.设置Redis 连接信息 spring.redis.database0 spring.redis.port6379 spring.redis.host…

Stable Diffusion - 哥特 (Goth) 风格服装与背景的 LoRA 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132177882 图像来源于 Goth Clothing 的 LoRA 效果&#xff0c;配合哥特 (Goth) 风格服饰的相关提示词。 测试模型&#xff1a;DreamShaper 8 哥…

HTTPS安全通信

HTTPS,TLS/SSL Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了SSL(Secure Sockets Layer)协议用于对Http协议传输的数据进行加密,保证会话过程中的安全性。 使用TCP端口默认为443 TLS:(Transport Layer Security,传输层…

java日期常用操作

Testpublic void validateDateUtils(){// 1 字符串转换日期Date result DateUtil.parse("2023-08-01", com.alibaba.excel.util.DateUtils.DATE_FORMAT_10);log.info("result : [{}]" , result);// 2 日期转换字符串final Date date new Date();String f…

(Python)Requests+Pytest+Allure接口自动化测试框架从0到1搭建

前言&#xff1a;本文主要介绍在企业使用Python搭建接口自动化测试框架&#xff0c;数据驱动读取excel表里的数据&#xff0c;和数据库方面的交互&#xff0c;包括关系型数据库Mysql和非关系型数据库MongDB&#xff0c;连接数据库&#xff0c;读取数据库中数据&#xff0c;最后…

Openlayers实战:多数据分散聚合

在飞机、轮船等地图显示的应用中,很多时候会用到数据聚合,Openlayers中提供了Cluster这个API ,他作为souce的一部分,设定distance值,如果2个点的间距小于 distance 所设置的数时,就会以聚合的方式显示。从而解决了数据淤积显示的状态,非常实用。 效果图 源代码 /* * @…

throw和throws的区别

在Java中&#xff0c;throw和throws是两个关键字&#xff0c;用于异常处理。它们具有以下区别&#xff1a; 1. throw关键字&#xff1a; - throw关键字用于主动抛出异常。当程序执行到throw语句时&#xff0c;会创建一个异常对象并将其抛出。 - throw语句通常在方法内部…

使用svg生成图像

使用svg生成图像 每个HTML开发人员都应该对可伸缩的向量图形有一个基本的理解。本文会通过使用svg创建一个雨伞图像来介绍一下svg的基本知识。 svg介绍 SVG 意为可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff09;。是一种可以在HTML中创建图像的方式。 我们…

【ChatGPT 指令大全】销售怎么借力ChatGPT提高效率

目录 销售演说 电话销售 产出潜在客户清单 销售领域计划 销售培训计划 总结 随着人工智能技术的不断进步&#xff0c;我们现在有机会利用ChatGPT这样的智能助手来改进我们的销售工作。在接下来的时间里&#xff0c;我将为大家介绍如何运用ChatGPT提高销售效率并取得更好的…

PCB制造中铜厚度的重要性

电子产品中的PCB是现代电子设备中不可或缺的一部分。在PCB制造过程中&#xff0c;铜厚度是一个非常重要的因素。正确的铜厚度可以保证电路板的质量和性能&#xff0c;同时也影响着电子产品的可靠性和稳定性。 一般我们常见的铜厚有17.5um&#xff08;0.5oz&#xff09;&#x…

推动多云管理平台发展的因素简单分析

随着云计算的快速发展&#xff0c;上云企业的不断增加&#xff0c;使用多云管理平台企业也在快速增加&#xff0c;多云管理平台发展越来越迅速。但还有不少人不明白为什么多云管理平台发展会这么快&#xff0c;推动多云管理平台发展的因素有哪些&#xff1f;今天我们大家就来简…

RISC-V基础之内存分布与映射

内存映射是指将地址空间划分为不同的部分或段&#xff0c;每个段有不同的用途和属性。这段话介绍了五个段&#xff1a;文本段、全局数据段、动态数据段、异常处理器段和操作系统&#xff08;OS&#xff09;段。下面是对每个段的简要说明&#xff1a; 文本段&#xff1a;存放程序…