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,一经查实,立即删除!

相关文章

React Native中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据

在您的数据采集上传的应用中集成ArcGIS以显示地图、渲染自定义图层和获取地理信息数据是一项常见需求。下面是如何实现这些功能的详细指南,包括具体步骤和示例代码。 1. 显示地图 原生开发 Android: 使用ArcGIS Android SDK。您需要在AndroidManifest…

tile-join的详细解释和使用说明

tile-join是Tippecanoe工具集中的一个实用命令,主要用于合并多个MBTiles文件,或者将属性数据添加到已有的MBTiles文件中。它可以处理大量的GeoJSON、Shapefile和MBTiles数据,并将它们合并成一个新的MBTiles文件。这对于需要结合多个数据源或者…

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

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

如果一个列表有100000个数据,这个该怎么进行展示?

当列表包含大量数据(如100,000个数据项)时,直接渲染所有数据到DOM可能会导致性能问题,因为浏览器需要处理大量的DOM节点。为了优化这种情况,有几种常见的策略可以使用: 分页(Pagination&#xf…

Python中的异常处理:try-except-finally详解与自定义异常类

Python中的异常处理:try-except-finally详解与自定义异常类 在Python编程中,异常处理是确保程序健壮性和可靠性的重要部分。当程序遇到无法预料的错误时,异常处理机制能够防止程序崩溃,并允许我们采取适当的措施来解决问题。本文…

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的目录结构和环境变量的…

相同的树-力扣

这道题目与堆成二叉树题目很相似,对称二叉树是每次传入的节点组合是 《左子树的左节点 和 右子树的 右节点》 《左子树的右节点 和 右子树的左节点》, 而这道题就更加简单,传入两棵树的左节点和右节点即可。 /*** Definition for a binary t…

[React]useEffect中return函数执行时机

已知在组件卸载时会执行return函数,其实在依赖项变更时也会执行。 import { useEffect, useState } from react;export default function HomePage() {const [count, setCount] useState(0);useEffect(() > {console.log(effect, count);return () > {conso…

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

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

Excel数据自动检测,语音报警VBA代码,语音提醒

要实现这个功能,你可以使用以下VBA代码: 1. 首先,在Excel中插入一个ActiveX控件(如"Microsoft Sound Control 6.0 (Spinner.Sound)"),并将其命名为"SoundControl"。 2. 然后&#xff0…

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…

Python 模块完全指南:从基础语法到高级应用的全方位解析

基本语法 在 Python 中&#xff0c;模块是一种包含 Python 代码的文件&#xff0c;用于组织和重用代码。模块可以包含变量、函数、类等&#xff0c;并且可以被其他 Python 程序导入和使用。 1. 导入模块 要使用一个模块&#xff0c;需要使用 import 关键字将其导入到当前的 …

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 …

EntitiesSample_7. EnableableComponents

该示例只要表达的是关闭和激活组件&#xff0c;之前的示例我们知道对于一个ECS组件需要继承IComponent接口,说明这个是一个组件&#xff0c;数组的话需要继承IBufferElementData接口&#xff0c;说明这个是一个数组元组组件&#xff0c;如果需要组件的激活控制&#xff0c;结构…

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为代表的开…

Python怎么配置环境变量:深度探索与实战指南

Python怎么配置环境变量&#xff1a;深度探索与实战指南 在Python编程的世界中&#xff0c;环境变量的配置是一个至关重要的步骤。它不仅影响着Python解释器的运行&#xff0c;还关系到各种第三方库和工具的使用。本文将带你深度探索如何配置Python的环境变量&#xff0c;并为…

猜排列 题解

推荐在 cnblogs 上阅读 猜排列 题解 差 eps 步想到正解。 题意描述 有 m m m 个长为 n n n 序列 a 1 , … , a n a_1,\dots,a_n a1​,…,an​&#xff0c;还有 m m m 个长为 n n n 序列 b 1 , … , b n b_1,\dots,b_n b1​,…,bn​。 其中 b i b_i bi​ 是由 a i …