java异常处理知识点总结

news2024/11/27 22:27:59

一.前提知识

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

        而这个异常就是一个类,所以它满足类的相关特性,再然后这个类又有许多子类,我们大体把这些子类分为两大类,第一大类称为:运行时异常类,第二大类称为:编译时异常(注意:编译时候出现的语法性错误,不能称为异常。例如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.coloradmin.cn/o/1802777.html

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

相关文章

Linux: ubi rootfs 故障案例 (1)

文章目录 1. 前言2. ubi rootfs 故障现场3. 故障分析与解决4. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. ubi rootfs 故障现场 问题故障内核日志如下: Starting ker…

【数据结构与算法 | 二叉树篇】力扣101, 104, 111,LCR144

1. 力扣101 : 对称二叉树 (1). 题 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false…

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比

【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客 字节开源的netPoll多路复用器源码解析-CSDN博客 一、几种常见的IO模型 1. 阻塞I/O (1) 解释: 用户调用如accept、read等系统调用,向内核发起I/O请求后,应用程序…

多样本上下文学习:开拓大模型的新领域

大模型(LLMs)在少量样本上下文学习(ICL)中展现出了卓越的能力,即通过在推理过程中提供少量输入输出示例来学习,而无需更新权重。随着上下文窗口的扩展,我们现在可以探索包含数百甚至数千个示例的…

基于JSP技术的文物管理系统

你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员界面 用户前台…

步态控制之ZMP

零力矩点(Zero Moment Point,ZMP)概述 ZMP步态控制是人形机器人步态控制中的一个关键概念,旨在确保机器人在行走或站立过程中保持平衡。ZMP是指机器人接触面上力矩为零的点,确保在该点上机器人不会倾倒。这个示例展示…

Python的登录注册界面跳转汽车主页面

1.登录注册界面的代码: import tkinter as tk from tkinter import messagebox,ttk from tkinter import simpledialog from ui.car_ui import start_car_ui# 设置主题风格 style ttk.Style() style.theme_use("default") # 可以根据需要选择不同的主题…

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址:竞拍商城系统源码后端PHP前端UNIAPP

Live800:深度解析,客户服务如何塑造品牌形象

在当今竞争激烈的市场环境中,品牌形象对于企业的成功至关重要。而客户服务作为品牌与消费者之间最直接的互动方式,不仅影响着消费者的购买决策,更在塑造品牌形象方面发挥着不可替代的作用。本文将深度解析客户服务如何塑造品牌形象&#xff0…

1074 宇宙无敌加法器(测试点5)

solution 每位权值不同的高精度加法测试点5&#xff1a;结果为0的情况 #include<iostream> #include<string> using namespace std; int main(){string rule, a, b, ans "";int carry 0, temp, cnt, power;cin >> rule >> a >> b;…

【Python】FastAPI返回不带双引号的字符串

昨天为获取代理ip写的一个接口&#xff0c;但返回的数据是带有双引号&#xff0c;终究不适合一些应用场景&#xff0c;带引号的是这样的&#xff1a; 说实在话&#xff0c;一时我也愣住了&#xff0c;竟然不知道要咋去掉这个双引号。因为是api接口&#xff0c;直接显示结果&…

HW面试常见知识点2——研判分析(蓝队中级版)

&#x1f340;文章简介&#xff1a;又到了一年一度的HW时刻&#xff0c;本文写给新手想快速进阶HW蓝中的网安爱好者们&#xff0c; 通读熟练掌握本文面试定个蓝中还是没问题的&#xff01;大家也要灵活随机应变&#xff0c;不要太刻板的回答&#xff09; &#x1f341;个人主页…

计算机网络 期末复习(谢希仁版本)第8章

元文件就是一种非常小的文件&#xff0c;它描述或指明其他文件的一些重要信息。这里的元文件保存了有关这个音频/视频文件的信息。 10. 流式&#xff1a;TCP&#xff1b;流式实况&#xff1a;UDP。

零基础入门学用Arduino 第二部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

在windows下使用本地AI模型提供翻译、对话、文生图服务

文章目录 在windows下使用本地AI模型提供翻译、对话、文生图服务ollama简介下载安装配置环境变量模型安装目录服务监听地址跨域配置我的配置注意事项 开机自启 使用运行模型对话时的命令 查看本地已安装模型删除模型 查看ollama支持的模型 Docker Desktop简介下载安装配置开机自…

Linux驱动应用编程(四)IIC(获取BMP180温度/压力数据)

本文目录 一、基础1. 查看开发板手册&#xff0c;获取可用IIC总线2. 挂载从机&#xff0c;查看从机地址。3. 查看BMP180手册&#xff0c;使用命令读/写某寄存器值。4. 查看BMP180手册通信流程。 二、IIC常用API1. iic数据包/报2. ioctl函数 三、数据包如何被处理四、代码编写流…

(2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干

Vision-LSTM: xLSTM as Generic Vision Backbone 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2 方法 3 实验 3.1 分类设计 4 结论 0. 摘要 Transformer 被广泛用作计算…

FM148R,FM147A和利时卡件

FM148R,FM147A和利时卡件。软件组成及各部分功能软件组成---各组件功能注意事项&#xff1a;仿真功能&#xff1a;仿真系统可以用于在单机上对组态完成的工程内容进行模拟运行。FM148R,FM147A和利时卡件。便于对这些组态内容的正确性和合理性进行初步调试。二、FM148R,FM147A和…

【Vue】面经基础版-案例效果分析

面经效果演示 功能分析 通过演示效果发现&#xff0c;主要的功能页面有两个&#xff0c;一个是列表页&#xff0c;一个是详情页&#xff0c;并且在列表页点击时可以跳转到详情页底部导航可以来回切换&#xff0c;并且切换时&#xff0c;只有上面的主题内容在动态渲染 实现思路…

C++基础四:C++模板编程

目录 一:函数模板 二:类模板 空间配置器allocator 一:函数模板 模板代码只能同一实现,不能先声明,再在另一文件实现,模板代码都是放在头文件当中的,在头文件中直接实现 二:类模板 template<typename T=int> class SeqStack // 模板名称+类型参数列表 = 类名称…