异常处理

异常概述

程序中的异常:

在Java语言中,异常是指程序在运行期间发生的事件,它是导致程序中断运行的正常指令流。

例如,在算术运算中除数为0、数组越界、空指针异常等,这些事件的发生都会阻止程序的正常运行。

*示例:**演示除法运算***

public class MathCalc {public static  int division(int dividend,int divisor){return  dividend/divisor;}public static void main(String[] args) {System.out.println(MathCalc.division(100, 0));}
}

异常分类:

1、Throwable类

位于异常类层次结构的顶端,它是Java中所有错误和异常的父类。

2、Error类

通常指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等。

这种错误无法恢复或不可能捕获,将导致应用程序中断。通常程序无法处理这些错误。

3、Exeception类

该类型的异常在程序中发生后可以进行捕获处理,处理后程序正常运行,从而保证程序的稳定性及健壮性。

Java程序开发中的异常处理,主要是针对Exception类及其子类进行的。

*示例:**演示数组下标越界异常***

public class RunException {public static void showRuntimeException(){int[] data=new int[2];System.out.println(data[2]);}public static void main(String[] args) {RunException.showRuntimeException();	}
}

分析:

  • 上述程序的数组长度为2,数组中元素的索引范围为0~1,当程序取索引值1时,超出了索引的取值范围,从而产生了数组下标越界。
  • 由于没有进行异常处理,程序立即终止。
  • 该异常属于运行时异常,其特点是:程序编译时可通过,但运行时却发生异常。

*常见运行时异常**RuntimeException***

异常类名称 说明
ArithmeticException 算数异常
ArrayIndexOutOfBoundsException 数组索引为负或大于等于数组大小异常
ClassCastException 对象转换异常
IlleegalArgumentException 调用方法时传入非法参数异常
IndexOutOfBoundsExxception 数组索引越界异常
NegativeArraySizeException 数组长度为负值异常
NullPointerExcception 控指针指向异常
NumberFormatException 数字格式异常
StringIndexOutOfBoundsException 数字格式异常
UnsupportedOperationException 操作错误异常

常见检查时异常 CheckedException:

异常类名称 说明
ClassNotFoundException 找不到指定class异常
IOException IO操作异常
FileNotFoundException 文件不存在异常
SQLException SQL语句异常
InterruptedException 终端异常

try...catch处理异常

Java异常处理的作用和运行机制:

Java的异常处理机制可以保障程序具有良好的容错性,使程序健壮性更高。

当程序运行出现意外情形时,系统会自动生成一个Exception类型的子类对象来通知程序,从而实现业务功能的代码与错误处理代码分离,使程序具有更好的可读性。

Java的异常处理机制提供了两种方式来处理异常,一种是使用“try-catch”语句处理异常,另一种是在方法声明时使用throws关键字将异常抛出。

语法:

try{//可能出现异常的语句
}catch(异常类型1 异常对象1){//异常处理代码
}

示例:演示try-catch捕获异常

try{//创建Scanner对象,用于接收控制台输入的数据Scanner input=new Scanner(System.in);System.out.println("请输一个整数除数:");int num=input.nextInt();System.out.println("您输入的数字是:"+num);
}catch(InputMismatchException e){System.err.println("输入不匹配异常:程序只能接收整数");
}

注意:

一个try块可以对应多个catch块,构成多重catch语句块,多重catch语句块用于对多个不同的 异常类型进行捕获,但最多只能选中一个执行。

先处理小异常,再处理大异常。即进行异常捕获时不仅应该将Exception类对应的catch块放在最后,而且所有父类异常的catch 块都应该放在子类异常catch块的后面,否则将出现编译错误。

示例:演示多重catch语句块

try{Scanner input=new Scanner(System.in);System.out.println("请输入被除数:");int divisor=input.nextInt();System.out.println("请输出除数:");int dividend=input.nextInt();System.out.println("您输入的两个数的是:"+divisor/dividend);
}catch(InputMismatchException e){System.err.println("输入不匹配异常:程序只能接收整数");
}
catch (ArithmeticException e) {System.err.println("算数异常:0不能作为被除数");
}catch(Exception e){System.err.println("未知异常");
}	

使用finally回收资源:

*语法:*

try{//可能出现异常的语句
}catch(异常类型1 异常对象1){//异常处理代码
} finally{//资源回收代码
}

说明:

finally块保证回收在try块中打开的物理资源,如数据库连接、网络连接或磁盘文件等。

无论try语句块中的代码是否出现异常,try语句块对应的任意一个catch语句块是否被执行,甚至在try或catch语句块中执行了return语句,finally块总会被执行。

无论是try语句块还是catch语句块中使用return语句,都要先执行完finally语句块后,再返回当前方法。

try语句不能独立存在,其后至少要有一个catch语句块或finally语句块。

finally语句块不是必须存在的,可以根据需求决定是否添加。

throw与throws

throw与throws

Java 强烈要求应用程序进行完整的异常处理。

throws用来声明一个方法可能抛出的所有异常信息。通常不用显示地捕获异常,系统将自动将异常抛给上级方法,throws出现在方法的头部。

throw指程序运行中抛出的一个具体的异常Exception,抛出的Exception需要用户来捕获处理。

*语法:*

[访问控制符]  返回类型  方法名称([参数列表])  throws  异常类1,  异常类2…
{
}

当前方法不知道如何处理当前异常时,可以使用throws关键字声明抛出异常,该异常可由上一级调用者处理。

throws声明只能在方法签名中使用。

throws可以声明抛出多个异常类,多个异常类之间以逗号隔开。

使用throws声明并抛出异常:

public class Read {//使用throws抛出程序可能发生的异常类,可由调用该方法处捕获处理public static void readFile() throws ClassNotFoundException,FileNotFoundException{//将com.java.Read类加载到JVM的内存中Class.forName("com.java.Read");//创建FileInputStream实例,用于读取文件中的数据FileInputStream  fis=new FileInputStream("c://file.txt");}public static void main(String[] args) {try {Read.readFile();} catch (FileNotFoundException e) {e.printStackTrace();//显示堆栈异常信息} catch (ClassNotFoundException e) {e.printStackTrace();}}
}

如果在main()方法中未使用try-catch捕获readFile()方法抛出的异常,而是在main()中继续将异常抛出,此时该异常交给JVM虚拟机进行处理。

不提倡开发人员在main()中将异常继续向上抛给JVM。

使用throw抛出异常:

语法:

throw  异常类对象

在实际的企业项目开发中,系统是否要抛出异常,可能需要根据应用的业务需求来决定,如果程序中的数据处理与指定的业务需求不符,这就是一种异常。

与业务需求不符而产生的异常,必须由开发人员来决定抛出,系统无法抛出这种异常。

如果需要在程序中自行抛出异常,则应该使用throw语句。

throw语句抛出的不是一个异常类,而是一个异常实例,且每次只能抛出一个异常实例。

public class UserInfo {private String name;private int age;...public void setAge(int age) throws Exception {if(age<18 || age>60){//使用throw抛出异常throw new Exception("员工年龄应该在18岁至60岁之间");}this.age = age;}...public static void main(String[] args) {UserInfo userInfo=new UserInfo();userInfo.setName("俞敏红"); //姓名赋值try {userInfo.setAge(10);  //年龄赋值  userInfo.showEmpInfo(); //显示员工信息} catch (Exception e) {e.printStackTrace(); }}
}

*throws**和**throw**的区别***

throws throw
声明一个方法可能抛出的所有异常类型 抛出一个具体的异常类实例
不用显式地捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法(即方法的调用者) 需要程序员自行捕获相关的异常
throws在方法头声明 throw在方法内部使用

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

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

相关文章

Matlab第一章

Matlab第一章 1.命令行窗口里写的命令,当文件关闭时命令行窗口和工作区内容消失。 2.想要保存代码,方法是: 新建脚本->写代码->保存->运行 3.脚本语言 (1)clear;清空工作区 clc;清空命令行窗口 x=20; y=30; x+y(2)clear; clc; x=20; y=30; x+y;如果x+y有分号则…

【题解】暑假集训CSP提高模拟14

目录Rank&挂分A. BA题目内容部分分10pts10+20pts正解思路代码B. BB题目内容部分分5pts正解思路代码C. BCD. BD Rank&挂分T4暴搜后来改了记搜,不知道哪里锅了,挂5pts。 A. BA 题目内容 现在有 \(m\) 块烙板,\(n\) 张饼,第 \(i\) 张饼需要烙 \(a_i\) 个单位时间,一张…

232Modbus转Profinet网关模块接液相柱塞泵与PLC通讯

本文介绍了232Modbus转Profinet网关(XD-PNR200)模块的使用步骤,包括硬件连接、软件配置和测试验证等环节,配置PLC与232Modbus转Profinet网关(XD-PNR200)IP,选功能码读写数据,分配设备名称并下载组态。测试通信后,可成功通讯。232Modbus转Profinet网关模块接液相柱塞泵…

挂载Ceph文件系统以及Ceph存储三副本特性展示

创建文件系统ceph fs volume create cephfs 挂载 CephFS 的常规先决条件 为客户端主机生成最小的 conf 文件并将其放在标准位置:mkdir -p -m 755 /etc/ceph ssh {user}@{mon-host} "sudo ceph config generate-minimal-conf" | sudo tee /etc/ceph/ceph.conf确保co…

nginx配置正向代理

1、下载源码包 # 地址http://nginx.org/download/2、下载ngx_http_proxy_connect_module补丁包 # 下载地址https://github.com/chobits/ngx_http_proxy_connect_module/archive/master.zip3、使用patch对源码包进行打补丁 # 先解压补丁包,得到的包名是ngx_http_proxy_connect_…

CSP14

暴力最高\(50\)吧,本地测试不太准跑得快的只得了\(10\)分,慢的却得了\(50\)分暴力 #include <bits/stdc++.h> #define pb push_back #define ll long long #define bs bitset<70> #define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); using na…

Goby漏洞发布 | CVE-2024-38856 Apache OFbiz /ProgramExport 命令执行漏洞【已复现】

漏洞名称:Apache OFbiz /ProgramExport 命令执行漏洞(CVE-2024-38856) English Name:Apache OFbiz /ProgramExport Command Execution Vulnerability(CVE-2024-38856) CVSS core: 9.0 漏洞描述: Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、…

LLM学习笔记-位置编码篇

在Transformer模型中,位置编码(Positional Encoding)的引入是为了补充自注意力机制(Self-Attention)在捕捉序列位置信息方面的不足。自注意力机制是Transformer的核心,但它对输入序列的位置信息并不敏感。具体来说,Transformer模型对输入序列中的每个元素进行处理时是并…

Profinet转Modbus网关运用在DCS系统中与变频器的通讯案例

在DCS(分散控制系统)系统中,Profinet转Modbus网关(XD-MDPN100)的应用是一个典型的工业自动化通讯案例,通过Profinet转Modbus网关(XD-MDPN100)将Profinet协议转换为Modbus协议,从而实现DCS系统与变频器之间的无缝通讯。一、案例背景 随着工业自动化程度的不断提高,DCS…

OpenAI 重大人事变动,联创加入死敌;阿里视频框架 Tora 操控物体运动轨迹丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

以“小”见“大” 打开“折叠”的世界

「 玩出个性,玩出潮流。」他来了!它来了! 昨晚,在年轻人的聚集地——B站,易烊千玺携手nova Flip亮相新生之夜。 带着“新一代”和“潮流”两个标签,这一款小折叠,为华为的折叠屏手机带来更多的可能性,也将激活整个折叠屏手机市场。 待激活的小折叠 经过几年的低迷期之后…

传奇单机版:复古三职业+无需虚拟机一键安装

今天给大家带来一款单机游戏的架设:传奇单机版。沉默版本 三职业 数值不变态 ,没有花里胡哨的东西(比如切割,生肖,时装等功能),客户端为16周年客户端 。另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了单机架设教程,不适用…