JavaSE:异常

1、什么是异常

在生活当中,不管是人还是动物又或是植物,都会生病;在程序中也是,作为程序猿,虽然我们会尽力将程序写的完美,可难免会出现一些问题~

在程序执行过程中,发生的一些不正常行为,就叫做异常。

2、异常的体系结构

我们可以观察到,Throwable是异常体系的顶层类,其派生出两个子类Exception(异常)和Error(错误)。

Exception:就是我们平时说的异常,可以理解为我们现实生活中的生病,我们可以通过代码来处理异常,使程序正常运行。

Error指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,例如:StackOverflowError(栈溢出错误),一旦发生就回力乏术。

3、异常的分类

Exception继承于Throwable,也就是说,异常其实是一个类,而异常又分为运行时异常(非受查异常)和编译时异常(受查异常)。

3.1 运行时异常(非受查异常)

其实大家对非受查异常并不陌生,我们平时遇到的例如:数组越界异常、空指针异常、算数异常、类型转换异常等都是非受查异常。

算数异常:

数组越界异常:

空指针异常:

3.2 编译时异常(受查异常)

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常。

例如当我们拷贝自定义类型的对象时,我们没有在main方法中声明异常,就会划红线报错:

受查异常必须进行处理,否则程序无法运行。

抛出异常后,异常警告消失,程序可以执行了。

但是需要注意的是,我们这里只是声明了异常,并没有处理掉这个异常,如果出现了异常,只会交给JVM来处理。一旦交给JVM处理,程序就会立即终止。

那,我们该如何去处理异常呢?

4、异常的处理

在Java中,异常处理主要用到5个关键字:throws、try、catch、throw、finally

4.1 throws 声明异常

我们在上述举例受查异常时就已经提到了throws关键字,当程序中可能会抛出编译时异常时,我们可以使用throws来声明这个异常,告诉调用者:"你要帮我处理掉这个异常!"

也就是说当前方法不出理这个异常,而提醒方法的调用者,让调用者帮它处理。

当前方法不处理异常而使用throws声明异常后,那该方法的调用者只有两条路走:

1. 老老实实的帮它处理掉这个异常(使用try{}catch{} ,下面会讲)

2. 不想帮它处理异常,也使用throws来声明这个异常(就是我们前面举例受查异常时所用到的解决方法)

也就是说,当编译时异常出现后,必须进行处理!(方法内部处理,或者方法调用者来处理,总之必须处理!)否则程序无法运行!

对于throws关键字有以下几点值得注意:

1. throws必须跟在方法的参数列表之后

2. 声明的异常必须是 Exception 或者 Exception 的子类

3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可

4. 调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出

4.2 try-catch 捕获处理异常

异常抛出后throws并没有处理异常,只是进行了声明,要想捕获处理异常,需要用到try-catch

语法格式:

我们在try{ }代码块中放入可能出现异常的代码,使用catch来进行捕捉,

代码举例:

我们来运行上图的代码:

需要注意的是:

1. 当程序抛出异常后,如果catch中有该异常的捕捉,则程序会直接跳到这个catch块执行catch中的代码,并从这个catch块继续往下执行(程序不会异常终止)。如果catch中没有捕捉到该异常,则会交给JVM来处理,程序也会立即终止。(也就是说我们可以用catch来捕捉多个异常,以免异常被交给JVM处理使程序异常终止)

2. try块中只会抛出一个异常,当异常被抛出,会立即来到对应的catch中进行捕捉,try块内抛出异常位置之后的代码将不会被执行,也就是说即使try块后面的代码有异常,也不会再抛出,所以不会抛出多个异常。

对于printStackTrace方法的作用,就是打印出该异常出现的位置,便于程序猿的发现,

如下图讲解:

try-catch知识点总结:

1. try块内抛出异常位置之后的代码将不会被执行

2. 如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到 JVM收到后中断程序----异常是按照类型来捕获的

3. try中可能会抛出多个不同的异常对象,则必须用多个catch来捕获----即多种异常,多次捕获

4.如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误

5.由于 Exception 类是所有异常类的父类,因此可以用这个类型表示捕捉所有异常(可以放到最后用来兜底,但是极不推荐只使用Exception来捕获异常 )

4.3 throw 手动抛出异常

我们之前讲到的异常的抛出,都是由于触发了JVM的机制由JVM来抛出的异常,这里的throw关键字是用来手动抛出异常的

例如:

因为异常都是一个类,所以我们throw出相应异常的对象就可以,也可以在构造方法传入相关信息。

其实,throw主要用于抛出自定义类型的异常。

需要注意:

1. throw必须写在方法体内部

2. 抛出的对象必须是Exception 或者 Exception 的子类对象(不能抛出自定义类的对象)

3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类(运行时异常),则可以不用处理,直接交给JVM来处理(但程序会立即终止)

4. 如果抛出的是编译时异常,用户必须处理,否则无法通过编译

5. 异常一旦抛出,其后的代码就不会执行

4.4 finally 

不管有没有抛出异常,是否被捕获,finally中的代码一定会执行的,一般在finally中进行一些资源清理的扫尾工作。

比如,当程序抛出异常时,要么异常被catch捕获,执行catch后代码;要么异常没有被catch捕获,程序异常终止。这两种情况都是会使程序的某些部分没有被执行,而程序中会有必要的部分必须被执行,例如:资源的关闭,那就可以把这段必须被执行的代码放入finally中。

其实,我们平时用的输入方法就是一种资源,我们利用finally来关闭它:

运行1:

运行2:

运行3:

我们发现,不管有没有抛出异常,也不管抛出异常后catch有没有捕获,哪怕是交给JVM来处理异常(程序异常终止),finally中的代码都被执行了。

我们还可以提前将方法返回:

我们发现,即使方法已经遇见return返回,后面finally中的代码仍然被执行了。

5、自定义异常类

Java当中虽说有着丰富的异常类,但是我们在开发过程中难免会遇见一些不能表示的异常,这时,我们就可以自定义异常。

如何自定义异常呢?

我们可以参考Java给出的异常源码(仅当参考):

仿照源码,创建自定义类,使之继承于Exception 或者 RuntimeException类,给出无参和带参的构造方法。

我们可以模拟实现用户登录界面,当用户名或者密码输入错误时,可以抛出自定义的用户名异常或者密码异常:

首先,写出自定义的用户名异常和密码异常:

当输入用户名或者密码错误时会抛出对应异常:

运行展示:

1.密码输入错误

2.用户名输入错误

3.输入正确

创建自定义异常类需要注意以下几点:

1. 自定义异常通常会继承自 Exception 或者 RuntimeException

2. 继承自 Exception 的异常默认是受查异常(必须捕获处理掉异常)

3. 继承自 RuntimeException 的异常默认是非受查异常

OK~本次博客到这里就结束了,

感谢大家的阅读~欢迎大家在评论区交流问题~

如果博客出现错误可以提在评论区~

创作不易,请大家多多支持~

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

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

相关文章

Windows系统安装openvino(2024.1.0)

一、openvino下载: 下载地址:下载英特尔发行版 OpenVINO 工具套件 (intel.cn) 下载完之后将压缩包解压,然后重命名文件夹为openvino_2024.1.0。 二、环境配置 以python环境为例:(建议使用moniconda虚拟环境来安装&am…

Android 图表开发开源库 MPAndroidChart 使用总结

1. 引言 电视项目中需要一个折线图表示节电数据变化情况,类比 H5 来说,Android 中也应该有比较成熟的控件,经过调研后,发现 MPAndroidChart 功能比较强大,网上也有人说可能是目前 Android 开发最好用的一个三方库了&a…

【力扣】LCR 130. 衣橱整理

一、题目描述 二、算法思路 这是⼀道非常典型的「搜索」类问题。 我们可以通过「深搜」或者「宽搜」,从 [0, 0] 点出发,按照题目的要求(选择 向右移动一格 或 向下移动一格,但不能移动到衣柜之外 )一直往 [m - 1, …

详解Spring IoCDI(二)

目录 承接上文:详解Spring IoC&DI (一) 1.IoC详解 1.1方法注解Bean 1.2方法注解要配合类注解使用 1.3定义多个对象 1.4重命名Bean 1.5扫描路径 2.DI详解 2.1DI与IoC的关系 2.2属性注入 2.3构造方法注入 2.4Setter注入 2.5 三…

代码随想录算法训练营第四十五天|1049.最后一块石头的重量II、494.目标和、 474.一和零

1049.最后一块石头的重量II 文档讲解:代码随想录 题目链接:. - 力扣(LeetCode) 本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 和昨天讲解的416. 分割等和…

visual studio code 全局搜索

VScode写代码的时候,会经常性的需要进行查找代码,那么怎么在Visual Studio Code中进行查找呢,下面就来大家vscode全局搜索的方法。 想要在vscode全局搜索进行全局搜索,使用快捷键CTRLSHIFTF即可进行搜索,也可以在左边…

哪吒监控+cfcdn+ 反代grp端口

哪吒监控cfcdn 反代grp端口 背景: 哪吒监控:感觉VPS线路不稳定,为了打消自己潜意识,希望量化延迟。 cfcdn:隐藏真实站点,保障小鸡隐秘安全 反代grpc端口: 反代grpc到支持https(TLS)的端口,这…

Tomcat启动闪退问题及解决方法

Tomcat启动闪退问题可能由多种原因引起,以下是一些常见的原因及相应的解决方法,按照清晰的结构进行归纳: 一、环境变量问题 Java环境问题:Tomcat依赖于Java环境,如果JDK未正确安装或环境变量配置不正确,会…

Elasticsearch 认证模拟题 - 3

1、题目 有一索引有 3 个字段,请写一个查询去匹配这三个字段,并且将三个字段的评分相加作为最后的总评分 # 创建索引 PUT task {"mappings": {"properties": {"fielda":{"type": "text"},"fie…

TrueNAS开启SSH登录ROOT

简介: 从 SCALE Bluefin 22.12.0 开始,为了加强安全性并遵守联邦信息处理标准 (FIPS),root帐户登录已被弃用。所有 TrueNAS 用户都应创建具有所有必需权限的本地管理员帐户,并开始使用它来访问 TrueNAS。当根用户密码被禁用时,只有管理用户帐户才能登录 TrueNAS Web 界面。…

从零学算法2965

2965. 找出缺失和重复的数字 给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次,b 缺失 之外,每个整数都 恰好出现一次 。 任务是找出重复的数字a 和缺失的数字 b 。 返回一个…

轮状病毒简介-卡梅德生物

轮状病毒是一种非常常见的病毒,主要影响婴幼儿和小孩,引起严重的胃肠炎,表现为严重腹泻、呕吐、发烧和脱水。这种病毒全球流行,是全世界五岁以下儿童因腹泻导致死亡的主要原因之一。轮状病毒属于Reoviridae家族,具有双…

逻辑回归【python,机器学习,算法】

逻辑回归是一种有监督的学习分类算法,用于预测目标变量的概率。目标或因变量的性质是二分法的,这意味着将只有两个可能的类。主要解决二分类问题。 主要步骤有三个: 求线性回归曲线。通过 sigmoid 函数将线性回归曲线转为 0-1 范围函数。 …

机器学习-11-使用kaggle命令下载数据集和操作指南

参考kaggle API 命令下载数据集 参考Kaggle操作完整指南(2023版) 参考Kaggle如何入门? 1 kaggle操作指南 Kaggle 是一个流行的数据科学竞赛平台。由 Goldbloom 和 Ben Hamner 创建于 2010 年。为什么这两个家伙要创立这样一个平台呢? 数据科学社区一直有这样一个难题:对…

低代码开发平台(Low-code Development Platform)的模块组成部分

低代码开发平台(Low-code Development Platform)的模块组成部分主要包括以下几个方面: 低代码开发平台的模块组成部分可以按照包含系统、模块、菜单组织操作行为等维度进行详细阐述。以下是从这些方面对平台模块组成部分的说明: …

docker安装mysql8和mysql5.7

1.docker安装mysql5.7,请点击此链接 2.docker安装mysql8并挂载数据卷 docker pull mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORDmy-secret-pw -d mysql:8.0 docker run --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -v /mqq/mysql8/datadir:/var/lib/mysql -d…

虚拟dom的理解

由普通的js对象来描述dom对象,是对于真实dom的映射,因为不是真实的dom对象所以叫虚拟dom。因为js处理数据的速度比操作dom的速度更快,性能更好,所以让现代这些react vue 等框架都采用了虚拟dom。 key值是唯一性的,在虚拟dom树进行…

【喜报】科大睿智服务企业通过CMMI3级认证

​北京建投科信科技发展股份有限公司(以下简称“北京建投科技” )前身为北京银帝科技发展公司,成立于1993年,注册资本6,000万元,为中国建银投资有限责任公司(简称“中国建投”)的成员企业建投华…

现在,所有人都能免费用GPT-4o了!

OpenAI今日官宣,ChatGPT正式向所有用户免费开放!所有用户均可以访问定制化GPT、分析图表、询问有关照片的问题以及5月初GPT-4o添加的其他功能。 OpenAI今天在X上发布推文: 「所有ChatGPT免费用户现在都可以使用浏览、视觉、数据分析、文件上…

element table表格行列合并span-method,根据数据动态行列合并

表格行列合并需要用到 table的方法 span-method 根据数据来进行动态的行列合并&#xff0c;实例如下&#xff1a; <el-table:data"tableData":span-method"objectSpanMethod" style"width: 100%"><el-table-columnprop"key"l…