认识JAVA中的异常

目录:
一. 异常概念与体系结构
二. 异常的处理
三. 自定义异常类
一. 异常概念与体系结构:
1 异常的概念:在 Java 中,将程序执行过程中发生的 不正常行为 称为异常,
如:算数异常ArithmeticException
System.out.println(10 / 0);
// 执行结果
Exception in thread "main" java.lang.ArithmeticException: / by zero

数组越界异常:ArrayIndexOutOfBoundsException

int[] arr = {1, 2, 3};
System.out.println(arr[100]);
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
空指针异常: NullPointerException
int[] arr = null;
System.out.println(arr.length);
// 执行结果
Exception in thread "main" java.lang.NullPointerException

2.异常的体系结构:异常种类繁多,为了对不同异常或者错误进行很好的分类管理, Java 内部维护了一个 异常的体系结构 如图:
从图中可以看出:
(1).Throwable 是异常体系的顶层类,其派生出两个重要的子类, Error Exception
(2). Error指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表: StackOverflowErrorOutOfMemoryError,一旦发生回力乏术。
(3).Exception 异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说的异常就是Exception。
OutOfMemoryError为内存泄漏 :程序中存在未释放的内存资源,导致内存占用不断增加,最终导致内存不足等等
StackOverflowError为:无限递归下去导致超出栈的容量等等
3. 异常的分类:分为 编译时异常,  运行时异常。
(1). 编译时异常:  在程序 编译期间 发生的异常,称为 编译时异常 ,也称为 受检查异常
如图:这个重写,克隆方法的拷贝,没有对其捕获或声明
下图则是声明: 就编译通过
2. 运行时异常:
(1) 在程序 执行期间 发生的异常,称为运行时异常,也称为 非受检查异常

(2)RunTimeException以及其子类对应的异常,都称为运行时异常

比如NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException

注意:编译时出现的语法性错误,不能称之为异常。例如将 System.out.println 拼写错了, 写成了
这里也用克隆举例子,这里没有实现克隆接口,却编译通过了!!!
但是运行会有异常:这就是非受查异常
二. 异常的处理:
在Java中, 异常处理主要的 5 个关键字: throw try catch final throws 。用好他们就,可以很好的处理异常了。
1. 异常的抛出 :在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者
注意:
(1). throw必须写在方法体内部
(2). 抛出的对象必须是Exception 或者 Exception 的子类对象
(3). 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
(4). 如果抛出的是编译时异常,用户必须处理,否则无法通过编译
(5). 异常一旦抛出, 其后 的代码就不会执行。
如图:这里还用了,try处理catch捕捉
public static void main(String[] args)throws ArrayIndexOutOfBoundsException {int[] array = new int[2];//捕捉异常try {//放可能发生的异常System.out.println(array[3]);System.out.println("这里不会再执行了");}catch (ArrayIndexOutOfBoundsException e) {//捕捉异常System.out.println("处理了ArrayIndexOutOfBoundsException异常");//捕捉,打印异常e.printStackTrace();}}

2.异常的捕获:异常的捕获,也就是异常的具体处理方式,主要有两种: 异常声明throws 以及 try-catch捕获处理。
抛出异常:
public static void OpenConfig(String filename) throws FileNotFoundException {if (filename.equals("config.ini")) {throw new FileNotFoundException("配置文件名字不对");}}

3.try-catch 捕获并处理 throws对异常并没有真正处理,而是将异常报告给抛出异常方法的调用者,由调用者处理。如果真正要对异常进行处理,就需要try-catch。)
此时声明一下,然后捕获:( 直接声明不捕获也可以
class Exception {File file;/*FileNotFoundException : 编译时异常,表明文件不存在此处不处理,也没有能力处理,应该将错误信息报告给调用者,让调用者检查文件名字是否给错误了*/public static void OpenConfig(String filename) throws FileNotFoundException {if (filename.equals("config.ini")) {throw new FileNotFoundException("配置文件名字不对");}}//捕获public static void main(String[] args) {try {//将可能出现异常的代码放在这里OpenConfig("test");} catch (FileNotFoundException e) {// 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基就会时,就会被捕获到e.printStackTrace();}finally {// 此处代码一定会被执行到,一般用来关闭文件,释放资源}}
}
注意:1.try块内抛出异常位置之后的代码将不会被执行。
2. 如果 抛出异常类型与catch时异常类型不匹配 ,即异常不会被成功捕获,也就不会被处理,继续往外抛 ,直到 JVM收到后中断程序。 (一般写法是,用父类异常在最后面兜底)

4.finally:
在写程序时, 有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源 :网络连接、数据库连接、IO 流等, 在程序正常或者异常退出时,必须要对资源进进行回收 。另外,因为 异常会引发程序的跳转,可能导致有些语句执行不到 finally 就是用来解决这个问题的。
还有 finally 中的代码一定会执行的,一般在 finally 中进行一些资源清理的扫尾工作
语法格式:
try{
// 可能会发生异常的代码
}catch(异常类型 e){
// 对捕获到的异常进行处理
}finally{
// 此处的语句无论是否发生异常,都会被执行到
}
// 如果没有抛出异常,或者异常被捕获处理了,这里的代码也会执行

(补充)异常的处理流程: 如果本方法中没有合适的处理异常的方式, 就会沿着调用栈向上传递 方法1--》方法2--》方法3---》main方法----》jvm)
三. 自定义异常类:
Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构.就需要自定义异常
例如, 我们实现一个用户登陆功能:
根据业务此时我们在处理用户名密码错误的时候可能就需要抛出两种异常
注意:
1.自定义异常类,然后继承自Exception 或者 RunTimeException
2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因
业务代码:
class login {private String userName;private String passWord;public  void loginFo(String userName, String passWord)throws UserException,PassWardException{if (!this.userName.equals(userName)) {throw new UserException("抛出自定义,的用户名错误异常");}if (!this.passWord.equals(passWord)) {throw new PassWardException("抛出密码自定义,的用密码错误异常");}System.out.println("登录成功!");}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}
}public class TestException {public static void main(String[] args) throws UserException {login login = new login();login.setPassWord("321");login.setUserName("haha");login.loginFo("haha", "323");/*try {login.loginFo("haha", "323");}catch (UserException e) {e.printStackTrace();}catch (PassWardException e) {e.printStackTrace();}finally {}*/}
}

                       

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

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

相关文章

Vue面试题精选大全及参考答案(5万字长文)

目录 Vue是什么? Vue的核心库为什么只关注视图层? Vue的MVVM模式是什么?

大豆、棉花深度学习数据集大合集

最近收集了一大波关于大豆和棉花的深度学习数据集,主要有叶片的识别、分类、计数以及病害检测等。 数据集的价值 科研价值:这些数据集为植物学、农业信息技术、机器学习等领域的科研人员提供了宝贵的资源。它们可以用于训练和优化各种深度学习模型&…

CCF CAT- 全国算法精英大赛(2024第二场)往届真题练习 4 | 珂学家

前言 餐馆 思路:可撤销的0-1背包 考察了多个知识点,包括 差分技巧离线思路0-1背包 不过这题卡语言,尤其卡python import java.io.*; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream;public…

C#开发的应用升级更新服务器端工具 - 开源研究系列文章 - 个人小作品

笔者开发过一些小应用,然后这些应用就需要有升级更新的功能,但是如果每个都集成进去也行,但是就是得写死更新的代码了。于是就想写一个应用升级更新的管理器,以前看到过Github上有一个AutoUpdate.Net,不过它那个要集成…

2024最新VMware Workstation Pro下载教程

自从2024年5月份之后,VMware workstation player就不能直接在vm官网下载,需要到broadcom博通网站上下载 下面介绍最新下载步骤: 百度直接搜索vmware 进入官网点击Workstation Pro链接 博通注册对应的账号 现在下载都需到博通注册对应的账号 登录邮…

展台设计需要注意哪些问题

一、明确设计目标与主题 在设计之前需要明确展台设计目标和主题。设计目标是指展台设计所要达到的目的和效果,提高企业知名度、促进产品销售等;设计主题则是展台设计的核心和灵魂,贯穿整个展台设计的风格和形式。参展企业需要清晰地界定设计目…

Linux常用环境Docker安装

一、mysql安装 简单安装 docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \mysql mysql容器本地挂载 cd /usr mkdir mysql cd mysql/ mkdir data mkdir conf mkdir init可以手动导入自己的数据库信息 docker run -d \--name mys…

03多表查询-子查询(一)

文章目录 第1关:子查询任务描述相关知识 答案 第2关:子查询-练习任务描述相关知识 答案 第3关:子查询-练习一任务描述相关知识 答案 第4关:子查询-练习二任务描述相关知识编程要求 答案 第5关:子查询-练习三任务描述相…

Spring MVC中,一个HTTP请求可能会被多个Handler处理

在Spring MVC中,一个HTTP请求可能会被多个Handler处理。这些Handler可能是HandlerInterceptor,ControllerAdvice,或者是具体的Controller。以下是这些Handler的执行顺序: 1. HandlerInterceptor的preHandle方法 当一个HTTP请求到…

@Transactional事务注解内含乾坤?

文章目录 前置知识实战1、无事务操作2、事务操作 总结 前置知识 MyBatis中的工作原理 读取配置文件:数据库连接信息、事务管理信息以及映射文件的位置加载映射文件:加载Mapper.xml这些映射文件,解析其中的 SQL 语句和结果映射信息创建 SqlS…

如何在Windows 10上的命令提示符下更改目录?这里提供方法

如果你刚开始在Windows 10上使用命令提示符,你需要知道如何更改目录。 如何在Windows上打开命令提示符 随着你对Windows 10上的命令提示符越来越熟悉,你需要学习的第一件事是如何更改操作系统文件系统中的目录。有几种方法可以做到这一点,所以我们将带你了解它们。 注意:…

JetBrains Mono字体下载及安装

百度云字体下载 提取码:zida 1.mac 安装 选择文件夹中的所有字体文件,然后双击它们。点击“安装字体”按钮。 2.windows 安装 选择文件夹中的字体文件,右键单击其中任何一个,然后从菜单中选择“安装”。 3.linux 安装 将字体…

JCR一区级 | Matlab实现TCN-LSTM-MATT时间卷积长短期记忆神经网络多特征分类预测

JCR一区级 | Matlab实现TCN-LSTM-MATT时间卷积长短期记忆神经网络多特征分类预测 目录 JCR一区级 | Matlab实现TCN-LSTM-MATT时间卷积长短期记忆神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.JCR一区级 | Matlab实现TCN-LSTM-MATT时间卷积长短…

问界新M7 Ultra仅售28.98万元起,上市即交付

5月31日,问界新M7 Ultra正式上市。发布会上,鸿蒙智行旗下多款产品交出最新答卷——问界新M5上市1个月大定突破2万台;智界S7位列30万纯电轿车4月交付量NO.3;问界M9上市5个月大定突破9万台。其中,作为中国高端豪华SUV市场…

STM32CubeMX重新生成代码时如何避免用户代码被覆盖

STM32CubeMX对于在STM32芯片上开发程序非常方便,但是有时发现:使用STM32CubeMX生成keil工程后,在这个工程上开发了一段时间,然后又有外设需要配置,这时使用STM32CubeMX打开MX工程开启外设,最后重新生成keil…

项目启动 | 宏昌电器牵手盘古信息,数字化制造引领企业高质量发展

随着时代的发展,数字化转型已成为实现企业持续增长和塑造竞争优势不可或缺的关键因素。浙江宏昌电器科技股份有限公司(以下简称为“宏昌电器”)围绕企业战略发展需求,积极加速数字化转型升级进程,以数字化力量推动公司…

计算机网络基础名词英汉译

【ARPANET】:美国国防部创立的第一个分组交换网 【互联网服务提供者ISP】:Internet Service Provider,互联网服务提供商:中国联通、中国移动、中国电信; 【互联网交换点IXP】:Internet eXchange Point,连接两个地区的…

docker-compose jira、bugzilla

一、jira 同这篇文章: linux docker 部署破解版本jira:8.4.0——测试体验(非商用)_jira docker-CSDN博客 直到构建完破解版本的镜像就可以了~ 二、bugzilla 1. 拉取镜像: 官网镜像搜索bugzilla,第一个就是: 直接…

mongodb 编码格式 Detected BSON

UTF-8编码兼容性问题 如果有非UTF-8编码的数据用mongo扩展可以读出来,用mongodb扩展读可能会抛异常(Detected corrupt BSON data), 这种一方面需要进行数据修复,另一方面需要堵住入口,避免出现此类问题。这种问题一般是在客户端发送的消息、…

字符串逆序数据结构

在数据结构中,字符串可以被视为一种特殊的数据类型,可以看作由字符组成的有序序列。因此,字符串的逆序可以采用各种数据结构来实现。 一种常见的方法是使用栈(Stack)数据结构。可以将字符串中的每个字符依次入栈&…