【JAVA语言-第13话】异常处理 之 try-catch-finally,throws,throw关键字的详细解析
目录
异常处理
1.1 概述
1.2 异常分类
1.3 异常处理
1.3.1 throws
1.3.2 try-catch
1.3.3 finally代码块
1.3.4 throw关键字
1.3.5 throw和throws的区别
1.4 自定义异常
1.4.1 概述
1.4.2 定义
1.4.3 自定义异常练习
异常处理
1.1 概述
在Java中,异常处理是一种机制,用于处理程序运行过程中可能发生的异常情况。异常是指在程序运行过程中发生的错误或意外情况,可能导致程序无法正常执行或出现不可预料的结果。
1.2 异常分类
异常可以分为以下几类:
-
编译时异常:在代码编译过程中发生的异常,需要在编译时被捕获和处理,否则代码无法通过编译。比如语法错误、类型转换错误等。
-
运行时异常:在程序运行过程中发生的异常,通常是由于程序逻辑错误或意外情况导致的。运行时异常不需要强制要求在代码中显式捕获和处理,但如果不处理,会导致程序崩溃。比如除数为零错误、空指针异常等。
-
自定义异常:开发人员可以根据具体需求自定义异常类,用于处理特定的异常情况。自定义异常需要继承自标准异常类或其子类,并重写异常类的构造方法和其他方法。
-
错误:表示程序无法恢复的严重问题,通常是由于系统错误、资源不足等情况导致的。错误无法通过捕获和处理来解决,只能通过程序终止来处理。

1.3 异常处理
Java中的异常处理两种方式,一是通过使用try-catch块来捕获和处理异常;try块用于封装可能会抛出异常的代码,而catch块用于捕获并处理try块中抛出的异常。二是通过throws声明在方法上,抛给外部调用的方法处理。

1.3.1 throws
格式:
方法声明 throws 异常类名 {
}
说明:
使用throws处理异常,是用于方法声明上。不在方法内部处理,由外部调用的方法进行处理。处理方式仍然是try-catch或者throws。
下面是使用throws处理异常的方式,main方法后面加上throws ParseException。
package com.zhy.exception;import java.text.ParseException;
import java.text.SimpleDateFormat;public class TestException {public static void main(String[] args) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String dateS = "123";//将字符串转换成日期时,如果dateS的格式和sdf定义的格式不一致,会抛出异常sdf.parse(dateS);}
}
1.3.2 try-catch
格式:
try {
// 可能会抛出异常的代码,只有产生异常才会走到catch块内部
} catch (异常类名1 变量) {
// 处理异常的代码,在工作中,一般会把异常的信息记录到一个日志中
}
……
catch(异常类名n 变量名){
}
说明:
1.try中可能会抛出多个异常对象,那么就可以使用多个catch来处理这些异常对象。
2.如果try中产生了异常,那么就会执行catch中的异常处理逻辑,执行完毕catch中的处理逻辑,继续执行try...catch之后的代码。
3.如果try中没有产生异常,那么就不会执行catch中异常的处理逻辑,执行完try中的代码,继续执行try...catch之后的代码。Throwable类中定义了三个异常处理的方法:
1.String getMessage():返回此Throwable的简短描述。
2.String toString():返回此Throwable的详细消息字符串。
3.void printStackTrace():JVM打印异常对象,默认此方法,打印的异常信息是最全面的。
下面是使用try-catch处理异常的方式,在main方法内部进行捕捉。
package com.zhy.exception;import java.text.ParseException;
import java.text.SimpleDateFormat;public class TestException {public static void main(String[] args) {try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String dateS = "123";sdf.parse(dateS);}catch (ParseException e) {e.printStackTrace();}}
}
当一段代码可能引发多种异常时,可以用多个catch捕捉详细的异常类,也可以用一个catch捕捉,将异常类型提升到Exception或者Throwable。
package com.zhy.exception;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.text.SimpleDateFormat;/*** 当代码块中可以产生多种异常,多种捕捉方式*/
public class TestException {/*** 捕捉方式一:* 使用throws声明在方法上,多个具体异常类型用逗号隔开。*/public void method1() throws ParseException, FileNotFoundException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String dateS = "123";File f = new File("d:/note.txt");//当字符串的格式不是日期时,会引发ParseException转换异常sdf.parse(dateS);//当文件不存在时,打开文件会引发FileNotFoundException文件找不到异常new FileInputStream(f);}/*** 捕捉方式二:* 使用throws声明在方法上,用异常的基类Exception接收,或者更高级别Throwable。*/public void method2() throws Exception {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String dateS = "123";File f = new File("d:/note.txt");//当字符串的格式不是日期时,会引发ParseException转换异常sdf.parse(dateS);//当文件不存在时,打开文件会引发FileNotFoundException文件找不到异常new FileInputStream(f);}/*** 捕捉方式三* 使用try-catch在方法内部捕捉,多个异常用多个catch处理,对应具体的异常类型。*/public void method3() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String dateS = "123";File f = new File("d:/note.txt");try {//当字符串的格式不是日期时,会引发ParseException转换异常sdf.parse(dateS);//当文件不存在时,打开文件会引发FileNotFoundException文件找不到异常new FileInputStream(f);}catch (ParseException e) {e.printStackTrace();}catch (FileNotFoundException e) {e.printStackTrace();}}/*** 捕捉方式四:* 使用try-catch在方法内部捕捉,用一个catch处理,异常类型定义为异常基类Exception或者Throwable。* @throws ParseException* @throws FileNotFoundException*/public void method4(){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String dateS = "123";File f = new File("d:/note.txt");try {//当字符串的格式不是日期时,会引发ParseException转换异常sdf.parse(dateS);//当文件不存在时,打开文件会引发FileNotFoundException文件找不到异常new FileInputStream(f);}catch (Throwable e) {e.printStackTrace();}}public static void main(String[] args) throws Exception{TestException e = new TestException();//方式一和方式二是使用throws处理异常,所以调用者要接着处理,这里处理的方式仍然是往外抛e.method1();e.method2();e.method3();e.method4();}
}
1.3.3 finally代码块
格式:
try {
// 可能会抛出异常的代码
} catch (异常类名 变量) {
// 处理异常的代码,在工作中,一般会把异常的信息记录到一个日志中
}finally{
// 无论是否出现异常都会执行,在工作中,一般用来关闭各种资源或者连接。
}
说明:
1.finally不能单独使用,必须和try一起使用。
2.finally一般用于资源释放(IO或者JDBC),无论程序是否出现异常,都会执行。
package com.zhy.exception;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class TestException {public Date parseTest(String dateS) {Date date = null;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try {//将字符串转换成日期时,如果dateS的格式和sdf定义的格式不一致,会抛出异常sdf.parse(dateS);}catch (ParseException e) {e.printStackTrace();}finally {date = new Date();}return date;}public static void main(String[] args) {TestException exception = new TestException();//返回:当前日期//因为finally里面的代码无论如何都会执行,且会在try-catch后面执行;//所以不管传递的是什么值,是否抛出异常,parseTest方法最后返回的都是当前日期;//这个案例无实际意义,只是为了说明finally的执行逻辑,在工作中,一般都是用来释放IO流或者JDBC连接资源的。Date date = exception.parseTest("9998-12-31");System.out.println(date);}
}
1.3.4 throw关键字
格式:
throw new 异常类名("异常产生的原因");
说明:
1.可以使用throw关键字在指定的方法中抛出指定的异常。
2.throw关键字必须写在方法的内部。
3.throw关键字后边new的对象必须是Exception类或者Exception的子类。
4.throw关键字抛出指定的异常对象,如果是运行时异常,可以不用处理;如果是编译时异常,必须采用throws或者try-catch处理异常。
1.3.5 throw和throws的区别
throws与throw这两个关键字接近,不过意义不一样,有如下区别:
- throws 出现在方法声明上;而throw通常都出现在方法体内。
- throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。
1.4 自定义异常
1.4.1 概述
java提供的异常类,有时不满足我们使用的场景时,需要自己定义一些异常类。
1.4.2 定义
格式:
public class XXException extends Exception | RuntimeException{
添加一个空参数的构造方法
添加一个带异常信息的构造方法
}
说明:
1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类。
2.自定义异常类,必须是继承Exception或者RuntimeException。
继承Exception:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译期异常,就必须处理这个异常,要么throws,要么try...catch
继承RuntimeException:那么自定义的异常类就是一个运行期异常,无需处理,交给虚拟机处理(中断处理)。
1.4.3 自定义异常练习
要求:
模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。
步骤一:定义异常类(RegisterException.java)
package com.zhy.exception;public class RegisterException extends Exception{//1.添加一个空参数的构造方法public RegisterException() {super();}//2.添加一个带异常信息的构造方法:所有异常类都会有一个带异常信息的构造方法,方法内部调用父类构造,由父类处理public RegisterException(String message) {super(message);}
}
步骤二:测试异常类(TestException.java)
package com.zhy.exception;import java.util.Scanner;public class TestException {public static void main(String[] args){//1.使用数组保存已经注册过的用户名String[] userNameArray = {"张三","李四","王武","赵立","张元"};//2、使用Scanner获取用户输入的注册的用户名System.out.println("请输入注册的用户名:");Scanner sc = new Scanner(System.in);String username = sc.nextLine();//3.遍历存储已经注册过用户名的数组,判断用户名是否存在boolean isExistUser = false;for(int i = 0; i < userNameArray.length; i++) {//如果用户名已经存在,抛出RegisterException异常,告知用户“亲,该用户名已经注册!”if (userNameArray[i].equals(username)) {isExistUser = true;try {throw new RegisterException("亲,该用户名已经注册!");} catch (Exception e) {e.printStackTrace();}}}//4.如果循环结束了,还没有找到重复的用户名,提示用户“恭喜你,注册成功!”if(!isExistUser) {System.out.println("恭喜你,注册成功!");}}
}
输出结果:
1.注册失败场景,抛出自定义异常。

2.注册成功场景 。

相关文章:
【JAVA语言-第13话】异常处理 之 try-catch-finally,throws,throw关键字的详细解析
目录 异常处理 1.1 概述 1.2 异常分类 1.3 异常处理 1.3.1 throws 1.3.2 try-catch 1.3.3 finally代码块 1.3.4 throw关键字 1.3.5 throw和throws的区别 1.4 自定义异常 1.4.1 概述 1.4.2 定义 1.4.3 自定义异常练习 异常处理 1.1 概述 在Java中,异常…...
ChatGPT4.0 >ChatGPT 3.5 > 文心一言
文章目录 前言一、ChatGPT4.0与ChatGPT3.5相比具有以下优点:二、ChatGPT和文心一言相比具有以下优点:总结 前言 ChatGPT是一种基于自然语言处理的对话型人工智能模型,由OpenAI开发。它是使用了大规模的语料库进行无监督学习的结果࿰…...
Linux 入门命令大全汇总 + Linux 集锦大全 【20240115】
文章目录 Linux 入门命令大全汇总Linux 集锦大全更多信息 Linux 入门命令大全汇总 别有一番风趣的alias 刚刚好合适的 apropos 命令 迷你计算器 bc 可看黄道吉日的 cal 全文可查看: Linux入门命令大全全文 Linux 集锦大全 linux终端中最漂亮的几款字体介绍及…...
【Web】NSSCTF Round#16 Basic个人wp(全)
出题友好,适合手生复健。 目录 ①RCE但是没有完全RCE ②了解过PHP特性吗 ①RCE但是没有完全RCE 上来就是一段md5八股 (string)就是不让用数组了,然后强比较需要md5碰撞 ?md5_1%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc…...
【目标跟踪】跨相机如何匹配像素
文章目录 前言一、计算思路二、代码三、结果 前言 本本篇博客介绍一种非常简单粗暴的方法,做到跨相机像素匹配。已知各相机内外参,计算共视区域像素投影(不需要计算图像特征)。废话不多说,直接来,见下图。…...
Python 发微信:实现自动化沟通的利器
引言: 在当今信息爆炸的时代,微信已经成为人们日常生活中不可或缺的沟通工具。然而,手动发送微信消息往往耗时耗力,尤其是在需要频繁发送消息的场景下。为了提高工作效率和便利性,我们可以利用 Python 编程语言来实现自…...
计算机网络——HTTP协议
1. HTTP的概述 HTTP(超文本传输协议),定义在RFC2616中,是用于分布式和协作式多媒体系统之间交互的应用层通信协议。 1.1 无状态 HTTP是一个无状态协议,意味着它不保存先前交互的记录。每个请求都独立于其他请求处理。…...
QT上位机开发(利用tcp/ip访问plc)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制,但是复杂的plc,还可以控制电机、变频器,在工业…...
MySQL-多表连接查询
🎉欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹 ✨博客主页:小小恶斯法克的博客 🎈该系列文章专栏:重拾MySQL 🍹文章作者技术和水平很有限,如果文中出现错误&am…...
Qt第二周周二作业
代码: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void paintEvent(…...
docker 学习命令整理
文章目录 docker 学习命令整理(积累中...)0. 启动/停止1. 运行2. 查看运行中docker3. 删除指定container4. 查看本地镜像5. 拉取指定镜像6. 新起终端进入同一container7. 取消sudo8. 查看docker状态9. 查看docker存储10.删除镜像11.删除容器12. qemu12.1 安装12.2 卸载qemu 附&…...
windows安装RabbitMq,修改数据保存位置
1、先安装Erlang, Erlang和RabbitMQ有版本对应关系。 官网RabbitMQ与Erlang版本对应RabbitMQ Erlang Version Requirements — RabbitMQ 2、安装RabbitMQ。 3、修改数据保存地址。找到安装目录下的sbin文件夹,找到rabbitmq-env.bat,编辑文件…...
Redis面试题18
Redis 支持集群模式吗?如何实现 Redis 的集群? 答:是的,Redis 支持集群模式,并提供了 Redis Cluster 来实现分布式数据存储和高可用性。 Redis Cluster 是通过将数据分散到多个节点上来实现的,每个节点都拥…...
python实现文件批量分发
在Python中实现文件的批量分发通常涉及到文件的读取、网络通信以及目标系统上的文件写入。这里有几种方法来实现这一功能,但最常见的方法之一是使用FTP(文件传输协议)或SSH(安全外壳协议)。以下是使用Python通过SSH进行文件批量分发的一个基本示例。这里使用了paramiko库,…...
分销商城多端uniapp 可编译5端 - 等级提现额度
等级提现额度 等级提现额度是一种常见的财务管理策略,通常用于在线平台、金融服务或游戏中,用于控制不同等级用户的提现限额。这样的机制有助于平台管理资金流动性,防范欺诈,并鼓励用户提升他们的活跃度或忠诚度。以下是一个简单的…...
蓝桥杯基础知识5 unique()
蓝桥杯基础知识5 unique() #include <bits/stdc.h>int main(){std::vector<int> vec {1,1,2,2,3,3,3,4,4,5};auto it std::unique(vec.begin(), vec.end());vec.erase(it, vec.end());//vec.erase(unique(vec.begin(),vec.end()),vec.end(…...
设计一个抽奖系统
👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…...
IntelliJ IDEA使用学习
一、安装教程 网上自行下载,CSDN不然过审二、使用教程 2.1 快捷键操作与设置 设置 Setting——>按键映射——>选择顺手的系统快捷键 编写代码 CtrlShift Enter,语句完成。 “!”,否定完成,输入表达式时按 …...
sqlilabs第五十三五十四关
Less-53(GET - GET - Error based - ORDER BY CLAUSE-String- Stacked injection) 手工注入 单引号闭合,和上一关一样堆叠注入解决 自动注入 和上一关一样 Less-54(GET - challenge - Union- 10 queries allowed -Variation 1) 手工注入 这一关开始后面的可以看…...
❤ Uniapp使用三( 打包和发布上线)
❤ Uniapp使用三( 打包和发布上线) 一、介绍 什么是 uniapp? uniapp 是一种基于 Vue.js 的多平台开发框架,它可以同时用于开发安卓、iOS、H5 等多个平台。因此,只需要写一次代码就可以在多个平台上运行,提高了开发效率。 打包…...
网盘直链获取工具:高效解析与实用指南
网盘直链获取工具:高效解析与实用指南 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用,去推广,无需输入…...
R语言实战:从Raw Counts到TPM/FPKM的完整转换指南(含代码调试技巧)
R语言实战:从Raw Counts到TPM/FPKM的完整转换指南(含代码调试技巧) 在生物信息学分析中,RNA-seq数据的标准化处理是确保后续差异表达分析可靠性的关键步骤。对于刚接触转录组数据分析的研究生和初级分析师来说,如何在R…...
如何快速上手艾尔登法环存档编辑器:新手完整指南
如何快速上手艾尔登法环存档编辑器:新手完整指南 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor ER-Save-Editor是一款专为《艾尔登…...
ngx_queue_sort
1 定义 ngx_queue_sort 函数 定义在 ./nginx-1.24.0/src/core/ngx_queue.cvoid ngx_queue_sort(ngx_queue_t *queue,ngx_int_t (*cmp)(const ngx_queue_t *, const ngx_queue_t *)) {ngx_queue_t *q, *prev, *next;q ngx_queue_head(queue);if (q ngx_queue_last(queue)) {r…...
实时与非实时操作系统核心技术对比与应用解析
实时与非实时操作系统技术解析1. 操作系统分类概述现代计算机系统根据任务调度机制的不同,主要分为实时操作系统(RTOS)和分时操作系统两大类。这两类系统在任务调度、资源分配和响应机制等方面存在本质区别,适用于不同的应用场景。1.1 实时操作系统定义实…...
s2-pro效果展示:高语速新闻播报(220字/分钟)清晰度实测
s2-pro效果展示:高语速新闻播报(220字/分钟)清晰度实测 1. 专业语音合成新标杆 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,正在重新定义文本转语音的技术标准。不同于常见的聊天式语音工具,s2-pro专注于提供…...
Llama-3.2V-11B-cot视觉推理实战教程:双卡4090一键部署保姆级指南
Llama-3.2V-11B-cot视觉推理实战教程:双卡4090一键部署保姆级指南 1. 项目概述 Llama-3.2V-11B-cot是基于Meta最新多模态大模型开发的视觉推理工具,专为双卡4090环境优化设计。这个工具让普通用户也能轻松体验11B级大模型的强大视觉推理能力࿰…...
Open Application Model组件模型详解:如何定义和封装可部署单元
Open Application Model组件模型详解:如何定义和封装可部署单元 【免费下载链接】spec Open Application Model (OAM). 项目地址: https://gitcode.com/gh_mirrors/spec3/spec Open Application Model(OAM)是一种开源的应用模型规范&a…...
021工程微服务治理实战:Spring Cloud Alibaba 2024 全景落地指南
工程微服务治理实战:Spring Cloud Alibaba 2024 全景落地指南 在工程行业数字化转型的深水区,我们面临着独特的技术挑战:一个大型地产项目往往涉及设计、采购、施工、监理、成本、营销等十几个业务域,服务调用链路复杂;…...
OFA图像描述模型在STM32嵌入式系统的边缘计算应用
OFA图像描述模型在STM32嵌入式系统的边缘计算应用 让嵌入式设备也能"看懂"世界并说出来 1. 项目背景与需求 你有没有想过,让一个小小的嵌入式设备不仅能"看到"图像,还能用语言描述出它看到了什么?这听起来像是科幻电影里…...
