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.就如我们刚刚分析的过程一样,是不会执行的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux中dd命令以及如何测试读写速度

dd命令详解 dd命令是一个在Unix和类Unix系统中非常常用的命令行工具,它主要用于复制文件和转换文件数据。下面我会详细介绍一些dd命令的常见用法和功能: 基本语法 dd命令的基本语法如下: bash Copy Code dd [option]...主要选项和参数 if…

Meta Llama 3 RMSNorm(Root Mean Square Layer Normalization)

Meta Llama 3 RMSNorm(Root Mean Square Layer Normalization) flyfish 目录 Meta Llama 3 RMSNorm(Root Mean Square Layer Normalization)先看LayerNorm和BatchNorm举个例子计算 LayerNormRMSNorm 的整个计算过程实际代码实现结…

OpenAI发表研究论文 介绍了一种逆向工程AI模型工作原理的方法

ChatGPT 开发商 OpenAI 构建人工智能的方法本周遭到了前员工的抨击,他们指责该公司利用可能有害的技术冒不必要的风险。今天,OpenAI 发布了一篇新的研究论文,目的显然是为了表明它在通过提高模型的可解释性来应对人工智能风险方面的认真态度。…

跨区域文件管控过程中 如何保障安全和效率?

跨区域文件管控是指在跨越不同地域或区域的情况下对文件进行管理和控制的过程。这种控制可能涉及多个方面,包括安全性、合规性和管理效率等。 为了有效进行跨区域文件管控,组织通常需要采取一系列策略和措施,例如: 1、加密和安全…

西门子学习笔记10 - MCGS和西门子1200进行通讯设置

1、博图软件的设置 1、修改PLC的ip地址为192.168.1.1 2、打开put,get通讯功能 3、设置通讯变量,可以是M区也可以是DB块的数据 2、MCGSE组态环境设置 1、新建项目,在设备窗口界面进入设备窗口 2、添加设备如下 3、双击进入配置界面 4、添加变…

把 FolkMQ 内嵌到 SpringBoot2 项目里(比如 “诺依” 啊)

FolkMQ (消息中间件)支持内嵌、单机、集群、多重集群等多种部署方式。 内嵌版,就相当于 H2 或 SQLite 数据库一样。给一些小项目(或者特别需求)带来了方便。大项目,则可以使用独立部署的 “单机版” 或 “…

原花青素优化定向壳聚糖微通道的简单免疫调控结构设计

引用信息 文 章:A facile Immunoregulatory Constructional Design by Proanthocyanidin Optimizing Directional Chitosan Microchannel 期 刊:Small(影响因子:13.3) 发表时间:29/02/2024 作 …

软件游戏找不到d3dx9_43.dll怎么办,三分钟教你解决此问题

在现代科技发展的时代,电脑已经成为我们生活中不可或缺的一部分。然而,在使用电脑的过程中,我们可能会遇到一些问题,其中之一就是电脑缺失d3dx943.dll文件。这个问题可能会影响到我们的正常使用,因此了解其原因和解决方…

AI Agentic Design Patterns with AutoGen(下):工具使用、代码编写、多代理群聊

文章目录 四、工具使用: 国际象棋游戏4.1 准备工具4.2 创建两个棋手代理和棋盘代理4.3 注册工具到代理4.4 创建对话流程,开始对话4.5 增加趣味性:加入闲聊 五、代码编写:财务分析5.1导入和配置代码执行器5.2 创建 代码执行/编写 代理5.3 定义…

IO进程线程(七)代码替换函数、守护进程

文章目录 一、代码替换函数(一)system函数(二)exec函数族 二、守护进程(一)创建1. 脱离父进程影响2. 脱离原会话组和进程组的影响3.修改进程工作目录4. 修改进程创建文件的掩码5. 关闭从父进程继承的文件描…

YB2416 SOP8封装30V耐压 低成本3A电流同步降压车充芯片

YB2416 SOP-8 SOP8封装30V耐压 输出电流3A 输出电压可调 输出限流调节 外部线补功能车充IC 过流打隔保护 YB2416A50 SOP-8 30V 3A 固定5V 输出 5%高恒流精度 欠压过流过温保护 YB2416是支持高电压输入的同步降压电源管理芯片,在 4~30V 的宽输入电压范围内可实现3A的…

http和https数据传输与协议区分

目录 1. 数据传输安全性2. 端口号3. URL 前缀4. SSL/TLS 证书5. 性能6. SEO 和用户信任7. 应用场景总结 HTTP(HyperText Transfer Protocol)和 HTTPS(HyperText Transfer Protocol Secure)是用于在客户端(如浏览器&…

Java基础_异常

Java基础_异常 异常体系介绍编译时异常和运行时异常异常的作用异常的处理方式JVM默认的处理方式自己处理(捕获异常)try...catch灵魂四问Throwable的成员方法 抛出处理 综合练习自定义异常来源Gitee地址 异常体系介绍 异常是什么? 程序中可能出…

输入偏置电流是什么?

输入失调电流与输入补偿电流概念一样(input offset current):同相减去反相输入端偏置电流的差值。这是由生产工艺导致同相与反相端的电流大小方向都会有所不同。 第一种情况:同相输入端减去反相输入端 第一种情况:同相…

windows环境安装多版本jdk与环境切换

1:JDK官网下载 2:安装目录 3:在系统环境变量新添加JAVA_HOME_8和JAVA_HOME_21 4:设置默认使用jdk21,如果需要切换,就更改JAVA_HOME的变量值 5:在环境变量path添加,%JAVA_HOME%\bin和…

Vue3学习第二天记录

Vue3学习第二天记录 背景说明截图记录一个简单的JS文件Vue3的watch()函数Vue3的toRef()/toRefs()函数前端数据类型的分类前端写一个对外暴露的函数前端的...语法Vue3中watch()函数的总结Vue3中watchEffect()函数Vue3中watch()函数的坑Vue3中computed()函数 背景 最近在学习尚硅…

Vue2学习(04)

目录 一、组件的三大组成部分 二、组件的样式冲突scoped 三、scoped原理 ​编辑 四、data是一个函数 五、组件通信 六、props详解 七、非父子通信 1.eventbus事件总线(可以一传多)--->作用是在非父子组件之间,进行简易的消息传递(复杂场景---&…

西瓜书总结——决策树原理+ID3决策树的模拟实现

西瓜书总结——决策树原理ID3决策树的模拟实现 前言1. 决策树结构2. 决策树的生成(注意区分属性和类别)3. 划分选择3.1 信息熵和信息增益3.2 增益率3.3 基尼指数(鸡你指数) 4. 剪枝处理4.1 预剪枝4.2 后剪枝 5. 连续值与缺失值处理…

获取东方财富网股票的实时数据股票的数据,并保存到Excel文件中

可以运行python文件获取东方财富网:【序号,代码,名称,最新价,涨跌幅,涨跌额,成交量,成交额,振幅,最高,最低,今开,昨收,量比,换手率,市盈率-动态,市净率,总市值,流通市值,涨速,5分钟涨跌,60日涨跌幅,年初至今涨跌幅,】数据,保存到Excel文件中。 import pandas as pd import re…

使用 Ollama 和 Open WebUI 自托管 LLM 聊天机器人(无需 GPU)

✨点击这里✨:🚀原文链接:(更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号!) 使用 Ollama 和 Open WebUI 自托管 LLM 聊天机器人(无需 GPU) &#x1f31…