java异常处理知识点总结

一.前提知识

        首先当运行出错的时候,有两种情况,一种叫做“错误”,另一种叫做“异常”。错误指的是运行过程中遇到了硬件或操作系统出错,这种情况程序员是没办法处理的,因为这是硬件和系统的问题,不能靠代码的修改而处理出错,所以错误这一块我们不需要操心。异常指的就是我们经常写完代码运行后,控制台报错这一情况。我们主要处理的就是这个异常

        而这个异常就是一个类,所以它满足类的相关特性,再然后这个类又有许多子类,我们大体把这些子类分为两大类,第一大类称为:运行时异常类,第二大类称为:编译时异常(注意:编译时候出现的语法性错误,不能称为异常。例如System拼写成system) 

        整体来说这个过程一共分四个阶段:异常声明——>异常抛出——>异常捕获——>异常处理

所以现在我们现在要形成这么一种大致感觉:这个东西不是主体那么重要的组成部分,而像是一副盔甲,如果不加也没什么太大的问题,就像我们之前没学过异常时写的代码,如果加了那么我们这个程序就更加完善,用专业语言形容就是“提高代码的健壮性”。(给我的感受就是类似于C语言的assert断言一样)

异常类的层次结构

其中Error类及其分支就是我们刚刚说的我们程序员解决不了的错误,我们程序员主要解决的就是Exception,其中RuntimeException就是我们刚刚讲的第一大类(运行时异常),而与RuntimeException同级的这些异常类统称为第二大类(编译时异常),我们现阶段主要学习的是RuntimeException及其分支

二.异常格式

try {//将可能会出现异常的代码放在这里
}catch (){//如果try里面的代码抛出异常了,如果catch里面的异常和try抛出的异常类型一致的话,就会捕获到,然后执行catch里面的代码
}catch (){//可以写多个catch,catch中的代码用来解决捕获异常后的解决措施
}finally {//此处代码不管怎么样,最后都会执行finally里面的代码,一般用在finally中进行一些资源清理的扫尾工作
}

一段涵盖异常知识点比较全面代码:

public class Test {public static int getData(){Scanner sc=null;try{sc=new Scanner(System.in);int data=sc.nextInt();return data;}catch (InputMismatchException e){e.printStackTrace();}finally {System.out.println("finally中代码");}System.out.println("try-catch-finally之后的代码");if (null!=sc){sc.close();}return 0;}public static void main(String[] args) {int data=getData();System.out.println(data);}
}

现在我们将这个格式一部分一部分的解析

1.try部分(抛出异常)

这个部分主要就是抛出异常这一步,而抛出异常有两种方式,一种是JVM自动抛出异常,一种是我们手动抛出异常,如我们上面这段代码,因为输入类型是nextInt,所以如果我们输入的不是整数,就会有问题,又因为我们没有手动抛出异常,所以此时会交给JVM来解决,JVM就会给我们抛出异常(也就是InputMismatchException这个异常类)。而如果我们手动抛出异常就会需要throw这个关键字,例如我们上面这段代码就可以更改为这样

        try{sc=new Scanner(System.in);int data=sc.nextInt();if (/*如果data不为整数*/){throw new InputMismatchException(); //因为是类,所以我们还要new来创建一个新类}return data;

2.catch(捕获异常)

这一部分主要就是捕获异常这一步,我们可以使用多个catch来捕获,如果发现抛出的异常和catch要捕获的异常类型一致,那么就被捕获了,此时会执行catch里面的语句,这里面的语句大致为这三个:

e.getMessage(),e.toString(),e.printStackTrace()

其中getMessage描述异常信息最简洁的,其次是toString,最全面的是printStackTrace(也是我们最常用的),例如我们上面catch这段代码就捕获了InputMismatchException这个异常,然后通过printStackTrace打印错误信息

注:如果多个catch中,出现了异常类之间具有父子类关系,那么父类必须写在最下面的catch;

如果多个异常的处理方式是完全相同的,可以catch(异常1  |   异常2)

3.finally(扫尾工作)

finally里面的代码是一定会执行的,不管try里面有没有异常,甚至直接被return,都会在return之前先把finally里面的代码执行完

如上面这行代码,如果运行正常,那么就直接return了,try-catch-finally之后的代码根本就没有执行,即输入流就没有被释放,造成资源泄漏,所以就需要finally,即便运行正常,在执行return之前,也会先跳到finally这里先把finally里面的代码执行,再跳回return

4.throws(声明异常)

还有一个知识点:throws,也就是异常声明,它的位置必须放在main方法那一行,例如

public static void main(String[] args) throws FileNotFoundException {

它的主要作用就在于处理编译时异常,虽然throws后面既可以跟运行时异常也可以跟编译时异常,但我们一般省略写运行时异常,其中的原因就是运行时异常会在编译器编译后运行的过程中发现问题进行报错,而编译时异常会在编译器编译的时候就报错,用人话来说就是如果throws后面不写运行时异常至少还能先让代码跑起来然后再报错,throws后面要是不写编译时异常,代码连跑都跑不起来就报错了。这时我们才用throws来解决这个问题,即我们知道它可能会有编译的问题,但是我们现在不想解决它,又想让代码先跑起来再说,等到以后提醒方法的调用者处理异常

注:如果声明多个异常,之间要用,隔开;如果声明的多个异常之间存在父子类关系,那么只用写父类的异常就好,子类不用写

三.自定义异常

如果有时候在这些类中没找到合适的异常类,例如密码错误,用户名错误这些,我们就需要自定义异常,格式一般为定义一个类然后继承异常,然后在构造方法中调用父类的构造方法即可

例子如下

class PasswordException extends Exception{public PasswordException(String message){super(message);}
}

调用例子如下

        if (!password.equals(password)){throw new PasswordException("密码错误");}

注:自定义异常通常会继承自Exception或者RuntimeException,继承Exception的异常默认是编译时异常,继承RuntimeException的异常默认是运行时异常

四:灵魂四问

现在我们提出四个问题,来理清楚代码执行顺序流程是怎么样的

1.如果try中没有遇到问题,怎么执行?

2.如果try中可能会遇到多个问题,怎么执行?

3.如果try中遇到的问题没有被捕获,怎么执行?

4.如果try中遇到了问题,那么在try中之后面的其他代码还会执行吗?

答案:

1.会把try里面所有的代码全部执行完毕,不会执行catch里面的代码,然后执行finally里面的代码,最后执行try-catch-finally之后的代码

2.当遇到第一个异常时,就会中止后面的try代码,然后去catch里面找,找到对应的异常,执行该catch里面的代码,最后执行finally里面的代码,try-catch-finally后面的代码不会执行

3.当遇到第一个异常时,就会中止后面的try代码,然后去catch里面找,如果没有对应的catch,那么就相当于我们try-catch白写了,这时JVM会自动帮我们解决报错,最后执行finally的代码,try-catch-finally后面的代码不会执行

4.就如我们刚刚分析的过程一样,是不会执行的

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

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

相关文章

使用GPT-soVITS再4060下2小时训练声音模型以及处理断句带来的声音模糊问题

B站UP主视频 感谢UP主“白菜工厂1145号员工”的“熟肉”,我这篇笔记就不展示整一个训练和推理流程,重点写的4060该注意的一些事项。如何解决断句模糊的问题,在本篇笔记的最末尾。 相关连接: 原项目github UP主的说明文档 1、训…

Linux的目录结构介绍和环境变量的设置

目录 前言一、系统环境二、Linux的目录结构2.1 Linux目录结构介绍2.2 Linux文件的路径描述2.2.1 绝对路径2.2.2 相对路径2.2.3 特殊的路径符 三、Linux的环境变量设置3.1 环境变量PATH3.2 关于$符的使用3.3 环境变量的设置 总结 前言 本篇文章介绍Linux的目录结构和环境变量的…

【云原生Kubernetes项目部署】k8s集群+高可用负载均衡层+防火墙

目录 环境准备 拓朴图 项目需求 一、Kubernetes 区域可采用 Kubeadm 方式进行安装 1.1所有节点master、node01、node02 1.2所有节点安装docker 1.3所有节点安装kubeadm,kubelet和kubectl 1.4部署K8S集群 1.4.1复制镜像和脚本到 node 节点,并在 …

html--酷炫背景引导主页

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>ZZVIPS酷炫背景引导主页</title><meta name"viewport" content"widthdevice-width,initial-scale1,maximum-scale1,user-scala…

jquery.datetimepicker控件不弹出的问题

项目场景&#xff1a; CRM项目&#xff0c;在项目中涉及日期类输入框&#xff0c;打算采用平常见到的点击选择日期的方式。在浏览了网页后&#xff0c;目前比较好的解决方案是jquery.datetimepicker和flatpicker两种&#xff0c;flatpicker的缺点是官网是英文版的&#xff0c;…

Android 13.0 Launcher3单层模式workspace中app列表页排序功能实现

1.概述 在13.0的定制化开发中,对于Launcher3的功能定制也是好多的,而对于单层app列表页来说排序功能的开发,也是常有的功能这就需要了解加载app数据的流程,然后根据需要进行排序就可以了,接下来就来实现这个功能 如图: 2. Launcher3单层模式workspace中app列表页排序功能…

【漏洞复现】Apache OFBiz 路径遍历导致RCE漏洞(CVE-2024-36104)

0x01 产品简介 Apache OFBiz是一个电子商务平台&#xff0c;用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。是美国阿帕奇(Apache)基金会的一套企业资源计划(ERP)系统。该系统提供了一整套基于Java的Web应用程序组件和工具。 0x02 …

How to: Add and Customize the Ribbon Skin List and Skin Gallery

皮肤列表和皮肤库允许用户选择皮肤。本文介绍如何在功能区中显示“皮肤列表”或“皮肤库”并对其进行自定义。 DevExpress演示中心中的大多数应用程序都允许您选择皮肤。例如&#xff0c;运行XtraGrid演示并导航到皮肤功能区页面以更改当前皮肤。 在功能区UI中显示皮肤列表或…

谁能赢?阿里的通义 VS 百度的文心

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 国产AI大模型领域&#xff0c;当前有两大阵营&#xff1a; (1)以百度文心一言为代表的闭源大模型。李彦宏曾说过&#xff1a;AI大模型开源意义不大&#xff0c;百度绝不抢开发者饭碗。 (2)以阿里通义AI为代表的开…

Ubuntu24.04基本配置

目录 0. 前言1. 连接网络2. 更新源3. 安装并配置vim4. 设置用户sudo免密5. 同步双系统时间6. 设置终端颜色主题7. 设置中文输入法8. 调整Dock位置等9. 设置Grub10. 其它美化设置10.1 夜灯10.2 壁纸10.3 终端加强gnome-tweaks10.4 字体 11. 常用工具11.1 邮箱配置11.2 翻译工具1…

如何微调 Llama 3 进行序列分类?

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

极域卸载不干净导致无法重新安装问题:独家解决方案

文章目录 一、问题二、解决1.网上常规方法2.本贴特殊之处 三、致谢 一、问题 极域卸载不干净&#xff0c;导致无法重新安装。 二、解决 1.网上常规方法 1.regedit命令注册表删除 topdomain、mythware、{5FB4EEDF-6A79-45C3-B049-EF327CA03FCD} 2.删除极域对应tmp文件 网上…

Go微服务: 分布式之通过可靠消息实现最终一致性

通过可靠消息实现最终一致性 可靠消息&#xff0c;就是靠普消息&#xff0c;还是基于之前的这个案例 比如这个订单服务&#xff0c;无论你是先发送消息&#xff0c;还是先新建订单&#xff0c;它其实都是发送的不可靠消息就是说如果这个消息&#xff0c;像mysql事务那样&#…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第七周) - 结构化预测

结构化预测 0. 写在大模型前面的话1. 词法分析 1.1. 分词1.2. 词性标注 2.2. 句法分析 2.3. 成分句法分析2.3. 依存句法分析 3. 序列标注 3.1. 使用分类器进行标注 4. 语义分析 0. 写在大模型前面的话 在介绍大语言模型之前&#xff0c;先把自然语言处理中遗漏的结构化预测补…

【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索

文章目录 引言机器学习与医疗健康的基本概念机器学习概述监督学习无监督学习强化学习 医疗健康概述疾病预测诊断辅助个性化治疗方案制定 机器学习与医疗健康的融合应用实时健康监测数据预处理特征工程 疾病预测与优化模型训练模型评估 诊断辅助与优化深度学习应用 个性化治疗方…

接口自动化Requests+Pytest基础实现

目录 1. 数据库以及数据库操作1.1 概念1.2 分类1.3 作用 2 python操作数据库的相关实现2.1 背景2.2 相关实现 3. pymysql基础3.1 整个流程3.2 案例3.3 Pymysql工具类封装 4 事务4.1 案例4.2 事务概念4.3 事务特征 5. requests库5.1 概念5.2 角色定位5.3 安装5.4 校验5.5 reques…

“中新美”三重身份,能帮SHEIN解决上市问题吗?

一家公司的海外上市之路能有多复杂&#xff1f;辗转多地的SHEIN&#xff0c;可能是当前最有话语权回答这个问题的公司。最近&#xff0c;它又有了新消息。 在上市信息多次更改后&#xff0c;伦敦正在成为SHEIN最有可能的“着陆”点。巴伦周刊援引英国天空新闻报道称&#xff0…

Python01 -分解整包数据到各个变量操作和生成器

Python 的星号表达式可以用来解决这个问题。比如&#xff0c;你在学习一门课程&#xff0c;在学期末的时候&#xff0c;你想统计下家庭作业的平均成绩&#xff0c;但是排除掉第一个和最后一个分数。如果只有四个分数&#xff0c;你可能就直接去简单的手动赋值&#xff0c;但如果…

5、搭建前端项目

5.1 使用vite vue搭建 win r 打开终端 切换到你想要搭建的盘 npm init vitelatest跟着以下步骤取名即可 cd fullStackBlognpm installnpm run dev默认在 http://localhost:5173/ 下启动了 5.2 用vscode打开项目并安装需要的插件 1、删除多余的 HelloWorld.vue 文件 2、安装…

【Vue3】理解toRef() 和 toRefs()

历史小剧场 知道可能面对的困难和痛苦&#xff0c;在死亡的恐惧中不断挣扎&#xff0c;却仍然能战胜自己&#xff0c;选择这条道路&#xff0c;这才是真正的勇气。----《明朝那些事儿》 前言 toRef 和 toRefs 是Vue3中的响应式转换工具函数 toRef: 不影响源对象的情况下&#x…