当前位置: 首页 > news >正文

【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. 编译时异常:在代码编译过程中发生的异常,需要在编译时被捕获和处理,否则代码无法通过编译。比如语法错误、类型转换错误等。

  2. 运行时异常:在程序运行过程中发生的异常,通常是由于程序逻辑错误或意外情况导致的。运行时异常不需要强制要求在代码中显式捕获和处理,但如果不处理,会导致程序崩溃。比如除数为零错误、空指针异常等。

  3. 自定义异常:开发人员可以根据具体需求自定义异常类,用于处理特定的异常情况。自定义异常需要继承自标准异常类或其子类,并重写异常类的构造方法和其他方法。 

  4. 错误:表示程序无法恢复的严重问题,通常是由于系统错误、资源不足等情况导致的。错误无法通过捕获和处理来解决,只能通过程序终止来处理。

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这两个关键字接近,不过意义不一样,有如下区别:

  1. throws 出现在方法声明上;而throw通常都出现在方法体内。
  2. 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中&#xff0c;异常…...

ChatGPT4.0 >ChatGPT 3.5 > 文心一言

文章目录 前言一、ChatGPT4.0与ChatGPT3.5相比具有以下优点&#xff1a;二、ChatGPT和文心一言相比具有以下优点&#xff1a;总结 前言 ChatGPT是一种基于自然语言处理的对话型人工智能模型&#xff0c;由OpenAI开发。它是使用了大规模的语料库进行无监督学习的结果&#xff0…...

Linux 入门命令大全汇总 + Linux 集锦大全 【20240115】

文章目录 Linux 入门命令大全汇总Linux 集锦大全更多信息 Linux 入门命令大全汇总 别有一番风趣的alias 刚刚好合适的 apropos 命令 迷你计算器 bc 可看黄道吉日的 cal 全文可查看&#xff1a; Linux入门命令大全全文 Linux 集锦大全 linux终端中最漂亮的几款字体介绍及…...

【Web】NSSCTF Round#16 Basic个人wp(全)

出题友好&#xff0c;适合手生复健。 目录 ①RCE但是没有完全RCE ②了解过PHP特性吗 ①RCE但是没有完全RCE 上来就是一段md5八股 (string)就是不让用数组了&#xff0c;然后强比较需要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…...

【目标跟踪】跨相机如何匹配像素

文章目录 前言一、计算思路二、代码三、结果 前言 本本篇博客介绍一种非常简单粗暴的方法&#xff0c;做到跨相机像素匹配。已知各相机内外参&#xff0c;计算共视区域像素投影&#xff08;不需要计算图像特征&#xff09;。废话不多说&#xff0c;直接来&#xff0c;见下图。…...

Python 发微信:实现自动化沟通的利器

引言&#xff1a; 在当今信息爆炸的时代&#xff0c;微信已经成为人们日常生活中不可或缺的沟通工具。然而&#xff0c;手动发送微信消息往往耗时耗力&#xff0c;尤其是在需要频繁发送消息的场景下。为了提高工作效率和便利性&#xff0c;我们可以利用 Python 编程语言来实现自…...

计算机网络——HTTP协议

1. HTTP的概述 HTTP&#xff08;超文本传输协议&#xff09;&#xff0c;定义在RFC2616中&#xff0c;是用于分布式和协作式多媒体系统之间交互的应用层通信协议。 1.1 无状态 HTTP是一个无状态协议&#xff0c;意味着它不保存先前交互的记录。每个请求都独立于其他请求处理。…...

QT上位机开发(利用tcp/ip访问plc)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 plc是工控领域很重要的一个器件。简单的plc一般就是对io进行控制&#xff0c;但是复杂的plc&#xff0c;还可以控制电机、变频器&#xff0c;在工业…...

MySQL-多表连接查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…...

Qt第二周周二作业

代码&#xff1a; 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&#xff0c; Erlang和RabbitMQ有版本对应关系。 官网RabbitMQ与Erlang版本对应RabbitMQ Erlang Version Requirements — RabbitMQ 2、安装RabbitMQ。 3、修改数据保存地址。找到安装目录下的sbin文件夹&#xff0c;找到rabbitmq-env.bat&#xff0c;编辑文件…...

Redis面试题18

Redis 支持集群模式吗&#xff1f;如何实现 Redis 的集群&#xff1f; 答&#xff1a;是的&#xff0c;Redis 支持集群模式&#xff0c;并提供了 Redis Cluster 来实现分布式数据存储和高可用性。 Redis Cluster 是通过将数据分散到多个节点上来实现的&#xff0c;每个节点都拥…...

python实现文件批量分发

在Python中实现文件的批量分发通常涉及到文件的读取、网络通信以及目标系统上的文件写入。这里有几种方法来实现这一功能,但最常见的方法之一是使用FTP(文件传输协议)或SSH(安全外壳协议)。以下是使用Python通过SSH进行文件批量分发的一个基本示例。这里使用了paramiko库,…...

分销商城多端uniapp 可编译5端 - 等级提现额度

等级提现额度 等级提现额度是一种常见的财务管理策略&#xff0c;通常用于在线平台、金融服务或游戏中&#xff0c;用于控制不同等级用户的提现限额。这样的机制有助于平台管理资金流动性&#xff0c;防范欺诈&#xff0c;并鼓励用户提升他们的活跃度或忠诚度。以下是一个简单的…...

蓝桥杯基础知识5 unique()

蓝桥杯基础知识5 unique&#xff08;&#xff09; #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(…...

设计一个抽奖系统

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…...

IntelliJ IDEA使用学习

一、安装教程 网上自行下载&#xff0c;CSDN不然过审二、使用教程 2.1 快捷键操作与设置 设置 Setting——>按键映射——>选择顺手的系统快捷键 编写代码 CtrlShift Enter&#xff0c;语句完成。 “&#xff01;”&#xff0c;否定完成&#xff0c;输入表达式时按 …...

sqlilabs第五十三五十四关

Less-53(GET - GET - Error based - ORDER BY CLAUSE-String- Stacked injection) 手工注入 单引号闭合&#xff0c;和上一关一样堆叠注入解决 自动注入 和上一关一样 Less-54(GET - challenge - Union- 10 queries allowed -Variation 1) 手工注入 这一关开始后面的可以看…...

❤ Uniapp使用三( 打包和发布上线)

❤ Uniapp使用三( 打包和发布上线) 一、介绍 什么是 uniapp&#xff1f; uniapp 是一种基于 Vue.js 的多平台开发框架&#xff0c;它可以同时用于开发安卓、iOS、H5 等多个平台。因此&#xff0c;只需要写一次代码就可以在多个平台上运行&#xff0c;提高了开发效率。 打包…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...