当前位置: 首页 > 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;提高了开发效率。 打包…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...