走进异常类的世界,自定义业务异常类实现指南

news2024/11/25 21:44:06

接下来这篇文章,小编将带领大家走进异常类的世界,探索异常类的奥秘。
在这里插入图片描述
引言
学习Java异常类,需掌握其基础概念,如try-catch语句、throw与throws关键字。通过实例理解异常层次结构,区分已检查与未检查异常。实践编写自定义异常类,并在项目中灵活运用异常处理机制,以提高代码的健壮性和可读性。

1. 异常概念与体系结构

2. 异常的处理方式

3. 异常的处理流程

4. 自定义异常类

一:异常概念与体系结构

异常的概念:

异常是指在程序运行过程中,由于某些错误或意外情况导致程序无法正常继续执行的现象。这些错误或意外情况可能包括但不限于:无效的输入、资源不可用、违反安全约束等。在Java等编程语言中,异常被当作对象来处理,允许程序在异常发生时采取适当的措施,如记录错误信息、释放资源、提示用户等,从而增强程序的健壮性和可靠性。
以下是一些常见的异常类及其用途:
NullPointerException:当应用程序试图在需要对象的地方使用 null 时抛出。
ArrayIndexOutOfBoundsException:当索引超出字符串或数组的有效范围时抛出。
ClassCastException:当试图将对象强制转换为不是实例的类时抛出。
NumberFormatException:当应用程序试图将字符串转换为一种数值类型,但该字符串没有适当的格式时抛出。
ArithmeticException:当出现数学错误时抛出,例如除以零。
IOException:当发生I/O错误时抛出,例如读写文件时出错。
SQLException:当使用JDBC与数据库交互时发生SQL错误或数据访问错误时抛出。

异常的体系结构:

Java的异常体系结构呈树状结构,其顶层是java.lang.Throwable类。Throwable类有两个主要的子类:Error和Exception。
Error:
Error类表示JVM层面的严重错误,这些错误通常是致命的,不能被捕获和处理。
Error类及其子类通常用于表示系统级的错误,如内存不足(OutOfMemoryError)、栈溢出(StackOverflowError)等。
Exception:
Exception类表示应用层的异常,这些异常通常是编程错误或意外的运行时情况导致的。
Exception类可以进一步细分为受检异常(Checked Exceptions)和非受检异常(Unchecked Exceptions)。
受检异常:在编译时期必须被捕获或声明的异常。这些异常通常是可以预期的,并且应该通过适当的异常处理机制来处理。例如,IOException、SQLException等。
非受检异常:在编译时期不需要被捕获或声明的异常,通常是运行时异常。这些异常通常是由于程序逻辑错误或不当的API使用导致的。例如,NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException等,它们都是RuntimeException的子类。
二:异常的处理
Java提供了一套异常处理机制,允许程序在异常发生时采取适当的措施。这些机制主要包括try、catch、finally、throw和throws关键字。
try-catch:用于捕获和处理异常。在try块中放置可能会抛出异常的代码,在catch块中处理这些异常。
finally:无论是否发生异常,finally块中的代码都会执行。通常用于清理资源,如关闭文件、释放数据库连接等。
throw:用于手动抛出一个异常。当程序检测到某个错误条件时,可以使用throw关键字抛出一个异常对象。
throws:用于声明一个方法可能会抛出的异常。这样,方法的调用者就可以知道需要处理哪些异常。

try-catch:用于捕获和处理异常。

try {  
    // 可能会抛出异常的代码  
} catch (SpecificExceptionType e) {  
    // 处理异常的代码  
}

finally:无论是否发生异常,finally 块中的代码都会执行,通常用于清理资源。

try {  
    // 可能会抛出异常的代码  
} finally {  
    // 清理资源的代码  
}

throw:用于手动抛出一个异常。

if (someCondition) {  
    throw new CustomException("Message");  
}

throws:用于声明一个方法可能会抛出的异常,这样调用者可以处理这些异常。

public void methodName() throws SpecificExceptionType {  
    // 可能会抛出异常的代码  
}

通过理解和使用Java的异常处理机制,开发者可以编写更健壮、更易于维护和调试的代码。同时,合理的异常设计也可以提高代码的可读性和可维护性。

三:异常的处理流程
异常处理的流程是编程中处理异常情况的一种系统化方法,特别是在Java等语言中,这一流程得到了广泛的支持和应用。以下是异常处理的主要流程:

一、异常的产生

异常通常是在程序运行过程中,由于某些错误或意外情况而产生的。这些错误或意外情况可能包括但不限于:无效的输入、资源不可用、违反安全约束、算术错误(如除以零)、空指针引用等。

二、异常的捕获

try块:
在Java中,使用try关键字来标记一个代码块,这个代码块中的代码可能会抛出异常。
try块中的代码会正常执行,直到遇到一个异常或代码块结束。
异常检测:
当try块中的代码抛出异常时,JVM(Java虚拟机)会检测到这个异常。
JVM会搜索与try块相关联的catch块,以找到能够处理该异常的代码。

三、异常的处理

catch块:
catch块用于捕获并处理try块中抛出的异常。每个catch块都指定了一个异常类型和一个处理该异常的代码块。当JVM找到一个与抛出的异常类型相匹配的catch块时,它会执行该catch块中的代码。
异常信息的获取:
在catch块中,可以使用异常对象来获取有关异常的信息。异常对象通常提供了几个方法来获取异常信息,如getMessage()(返回异常的详细消息字符串)、toString()(返回异常的简短描述)和printStackTrace()(打印异常的堆栈跟踪信息)。

四、异常的传递

方法的异常声明:
如果一个方法可能会抛出异常,但该方法不想在内部处理这个异常,那么它可以使用throws关键字来声明这个异常。这意味着调用该方法的代码需要处理这个异常,或者再次声明这个异常。
异常的向上传递:
如果一个方法抛出了一个异常,并且这个异常没有被该方法的catch块捕获,那么这个异常会向上传递到调用该方法的方法中。这个过程会一直持续到找到一个能够处理该异常的catch块,或者异常到达程序的顶层(如main方法),此时JVM会终止程序并打印异常信息。

五、异常的最终处理

finally块:
finally块是可选的,但它提供了一种在异常处理流程结束时执行清理代码的机制。无论是否发生异常,finally块中的代码都会执行(除非在try或catch块中调用了System.exit()方法)。finally块通常用于释放资源,如关闭文件、释放数据库连接等。
异常处理的结束:
一旦异常被处理(无论是通过catch块还是通过方法的异常声明传递到上层),异常处理流程就会结束。程序会继续执行异常处理之后的代码(如果有的话)。
综上异常处理的流程包括异常的产生、捕获、处理、传递和最终处理。通过这一流程,程序可以在遇到错误或意外情况时保持健壮性,并提供有用的信息来帮助开发者诊断和修复问题。
四: 自定义异常类
有时,我们可能需要定义自己的异常类来表示特定的错误情况。我们可以通过扩展 Exception 类或 RuntimeException 类来创建自定义异常。在Java编程语言中,自定义异常类是通过继承Java异常体系中的某个类(通常是Exception或其子类)来实现的。创建自定义异常类的主要目的是为了更好地描述和处理程序中特定的错误情况。以下是一个创建和使用自定义异常类的基本步骤:
1. 定义自定义异常类
首先,你需要定义一个类,这个类需要继承自Exception(或其子类,如RuntimeException)。在定义时,你可以根据需要添加字段来存储额外的错误信息,以及重写构造方法来初始化这些字段。

public class MyCustomException extends Exception {  
    // 自定义字段(可选)  
    private int errorCode;  
  
    // 默认构造方法  
    public MyCustomException() {  
        super();  
    }  
  
    // 带错误信息的构造方法  
    public MyCustomException(String message) {  
        super(message);  
    }  
  
    // 带错误信息和错误代码的构造方法  
    public MyCustomException(String message, int errorCode) {  
        super(message);  
        this.errorCode = errorCode;  
    }  
  
    // 获取错误代码的getter方法  
    public int getErrorCode() {  
        return errorCode;  
    }  
}

2. 在程序中抛出自定义异常:
在程序的某个位置,当遇到特定错误情况时,你可以使用throw关键字来抛出这个自定义异常。

public void someMethodThatThrowsException() throws MyCustomException {  
    // 假设这里有一些逻辑判断  
    boolean errorCondition = true; // 示例条件  
  
    if (errorCondition) {  
        // 抛出自定义异常  
        throw new MyCustomException("An error occurred!", 123);  
    }  
}

3. 捕获和处理自定义异常:
在调用可能抛出自定义异常的方法时,你需要使用try-catch块来捕获和处理这个异常。

public void callingMethod() {  
    try {  
        someMethodThatThrowsException();  
    } catch (MyCustomException e) {  
        // 处理自定义异常  
        System.out.println("Caught MyCustomException: " + e.getMessage());  
        System.out.println("Error Code: " + e.getErrorCode());  
    }  
}

注意事项:
选择继承的基类:根据你的需求选择继承自Exception还是RuntimeException。Exception是受检异常,需要在方法签名中声明,而RuntimeException是非受检异常,不需要声明。
提供有用的信息:在异常的构造方法中提供尽可能多的有用信息,这有助于调试和错误处理。
文档化:在方法的文档注释中说明可能抛出的自定义异常,以便其他开发者了解。
通过自定义异常类,你可以更精确地描述程序中的错误情况,并提供额外的上下文信息来帮助处理和调试这些错误。

通过理解和使用Java的异常处理机制,我们可以编写更健壮、更易于维护和调试的代码。
在这里插入图片描述

今天就到这了!!!

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

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

相关文章

springboot文件上传(阿里云oss)

本地存储 使用uuid是为了避免文件名的重复&#xff0c;防止覆盖 RestController public class FIleUploadController {PostMapping("/upload")public Result<String> upload(MultipartFile file) throws IOException {//把文件的内容存储到本地磁盘上String …

基于SpringBoot+Vue的在线投票系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

C++的STL标准模版库容器--list类

前言 list(双向链表)类属于STL标准模版库容器模块&#xff0c;它的迭代器是双向迭代器&#xff0c;也比较好理解&#xff0c;它申请空间不是一次申请一块空间而是每一个节点各自独立的空间&#xff0c;它不再能够支持随机访问和[]&#xff0c;如果想要和string类容器或者vecto…

集合源码1

一、List接口分析 1、list接口的特点 ①List集合的所有元素是由一种线性方式进行存储的。 ②它是一个元素存储有序的集合。即元素的存入顺序和取出顺序有保证。 ③他是一个带有索引的集合&#xff0c;通过索引就可以精确的操作集合中的元素 ④集合中可以有重复的元素&#xff0…

二分查找算法——寻找旋转排序数组中的最小值点名

1.题目解析 题目来源&#xff1a;LCR173.点名——力扣 原名&#xff1a;剑指offer——0~n-1中消失的数字 测试用例 题目来源&#xff1a;153.寻找旋转排序数组中的最小值——力扣 测试用例 2.算法原理 点名 如果要寻找消失的数字&#xff0c;可以判断对应下标的数字是否和下标对…

视觉定位Revisit Anything

Revisit Anything: Visual Place Recognition via Image Segment Retrieval 项目地址 摘要&#xff1a; 准确识别重游地点对于嵌入代理的定位和导航至关重要。这要求视觉表现清晰&#xff0c;尽管摄像机视点和场景外观有很大变化。现有的视觉地点识别管道对“整个”图像进行编码…

制作离线版Koczkatamas工具包

一、下载源码 从https://github.com/koczkatamas/koczkatamas.github.io下载koczkatamas.github.io-master.zip 二、解压 $ unzip koczkatamas.github.io-master.zip三、运行index.html 可以看到输入一个字符后&#xff0c;下面的各种编码都没有显示&#xff0c;则表示运行…

【玩转 JS 函数式编程_008】3.1.2 JavaScript 函数式编程筑基之:箭头函数——一种更流行的写法

文章目录 3.1.2 箭头函数——更流行的方式 Arrow functions - the modern way1. 返回值 Returning values2. this 值的处理 Handling the this value3. arguments 的处理 Working with arguments4. 单参数还是多参数&#xff1f; One argument or many? 写在前面 故天将降大任…

儿童需要学习C++多久才能参加信息学奥赛的CSP-J比赛?

信息学奥赛&#xff08;NOI&#xff09;是国内编程竞赛领域的顶尖赛事&#xff0c;而对于初学者来说&#xff0c;参加NOI的第一步通常是通过CSP-J&#xff08;全国青少年信息学奥林匹克联赛初赛&#xff09;&#xff0c;这也是面向青少年程序员的入门级竞赛。作为信息学奥赛的基…

vue3使用three.js加载.obj模型示例

vue3使用three.js加载.obj模型示例 效果&#xff1a; 代码&#xff1a; 需要先安装three.js npm install three<template><div ref"threeContainer" class"three-container"></div> </template><script> import * as TH…

男单新老对决:林诗栋VS马龙,巅峰之战

听闻了那场激动人心的新老对决&#xff0c;不禁让人热血沸腾。在这场乒乓球的巅峰之战中&#xff0c;林诗栋与马龙的对决无疑是一场视觉与技术的盛宴。 3:3的决胜局&#xff0c;两位选手的每一次挥拍都充满了策略与智慧&#xff0c;他们的每一次得分都让人心跳加速。 林诗栋&am…

10.6学习

1.Hystrix / Sentinel ●服务雪崩场景 自己即是服务消费者&#xff0c;同时也是服务提供者&#xff0c;同步调用等待结果导致资源耗尽 ●解决方案 服务方&#xff1a;扩容、限流&#xff0c;排查代码问题&#xff0c;增加硬件监控 消费方&#xff1a;使用Hystrix资源隔离&a…

JavaSE——面向对象10:抽象类、接口

目录 一、抽象类 (一)抽象类的引出 (二)抽象类基本介绍 (三)注意事项和使用细节 (四)抽象类的最佳实践——模板设计模式 二、接口 (一)接口快速入门 (二)基本介绍 (三)注意事项与使用细节 (四)接口VS继承 (五)接口的多态性 1.多态参数 2.多态数组 3.接口存在多态…

CoreGen项目实战——代码提交信息生成

数据与相关代码见文末 1.概述 源代码与自然语言之间的语义鸿沟是生成高质量代码提交信息的一个重大挑战。代码提交信息对于开发者来说非常重要,因为它们简明扼要地描述了代码更改的高层次意图,帮助开发人员无需深入了解具体实现即可掌握软件的演变过程。手动编写高质量的提交…

Vite多环境配置与打包:

环境变量必须以VITE开头 1.VITE_BASE_API&#xff1a; 在开发环境中设置为 /dev-api&#xff0c;这是一个本地 mock 地址&#xff0c;通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA&#xff1a; 设置为 "true"&#xff0c;表示启用调试工具&#xff0c;通常是为了…

Elasticsearch学习笔记(六)使用集群令牌将新加点加入集群

随着业务的增长&#xff0c;陆续会有新的节点需要加入集群。当我们在集群中的某个节点上使用命令生成令牌时会出现报错信息。 # 生成令牌 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node出现报错信息&#xff1a; Unable to create enrollment…

VMware WorkStation Pro 15.5(低版本安装) 教学用

VMware WorkStation Pro 15.5(低版本安装) 教学用 文章目录 VMware WorkStation Pro 15.5(低版本安装) 教学用前言安装使用 前言 VMware Workstation Pro 15.5 是一款功能强大的桌面虚拟化软件&#xff0c;适用于在单台物理电脑上运行多个操作系统。它被广泛应用于软件开发、测…

【文献阅读】Attention Bottlenecks for Multimodal Fusion

Abstract 在多模态视频分类中&#xff0c;将各模态的最终表示或预测进行后期融合&#xff08;“后期融合”&#xff09;仍然是主流范式。为此&#xff0c;本文提出了一种基于 Transformer 的新型架构&#xff0c;该架构使用“融合瓶颈”在多个层次进行模态融合。与传统的成对自…

科研必备语料库

1. Corpus of Contemporary American English 链接&#xff1a;https://www.english-corpora.org/coca/ 2. Purdue Online Writing Lab 链接&#xff1a;https://owl.purdue.edu/owl/ 3. Academic Phrases and Vocabulary 链接&#xff1a;https://www.ref-n-write.com/blog…

IntelliJ IDE 插件开发 | (十三)自定义项目脚手架(下)

系列文章 本系列文章已收录到专栏&#xff0c;交流群号&#xff1a;689220994&#xff0c;也可点击链接加入。 前言 在上一篇文章中介绍了如何在 IDEA 中自定义项目脚手架&#xff0c;本文将介绍如何在WebStorm、PyCharm、CLion等其它 IntelliJ 主流平台中如何自定义项目脚手…