Java学习十五—异常处理

news2024/12/26 23:55:51

一、关于异常

1.1 简介

在Java中,异常(Exception)是指程序执行过程中可能遇到的意外或错误情况。
Java异常处理是Java语言中一个重要的机制,用于处理程序运行时发生的异常情况。

image​​

1.2 分类

Java异常分为两大类:

  1. 编译时异常(Checked Exceptions) :这些异常需要在编写代码时显式地处理或声明抛出。编译时异常通常是可恢复的,比如IOException​、SQLException​等。
  2. 运行时异常(Runtime Exceptions) :这些异常是不可查的,也就是说,它们不需要在代码中显式地进行捕获或声明抛出。运行时异常通常是编程错误导致的,比如NullPointerException​、ArrayIndexOutOfBoundsException​等。

1.3 体系结构

Java异常体系结构是Java语言中处理错误和异常情况的核心机制。Java异常体系基于类层次结构,所有异常类都是Throwable​类的子类。下面是Java异常体系结构的详细介绍:

1. **Throwable**

Throwable​ 是所有错误或异常的超类。它定义了所有异常和错误共有的属性和方法,例如错误消息、异常链等。Throwable​类有两个主要的子类:

  • Error​:表示编译时和系统错误(如OutOfMemoryError​、StackOverflowError​等),通常是不可恢复的。
  • Exception​:表示程序运行时可以捕获并处理的异常。

2. **Error**

Error​ 类用于指示合理的应用程序不应该尝试捕获的严重问题。大多数这种类型的错误都是与JVM(Java虚拟机)相关的问题,如资源耗尽错误(VirtualMachineError​)或系统行为错误(AssertionError​)。

3. **Exception**

Exception​ 类是程序能够处理的异常情况的超类。它进一步分为两大类:

  • 编译时异常(Checked Exceptions) :必须在方法调用时被捕获或声明抛出。这些异常通常是可预见的,比如IOException​、SQLException​等。
  • 运行时异常(Runtime Exceptions) :不需要被捕获或声明抛出,通常是编程错误导致的,如NullPointerException​、IllegalArgumentException​等。​​

img

二、异常处理机制

2.1 关键字

Java的异常处理机制主要包括以下几个关键字:

  • try​:用于定义一个代码块,这个代码块中可能抛出异常。

  • catch​:用于捕获try​块中抛出的异常,并进行处理。

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

  • throw​:用于在代码中手动抛出一个异常。

  • throws​:用于声明方法可能抛出的异常。

2.2 try catch

在Java中,try-catch​语句是一种异常处理机制,用于捕获和处理可能在程序执行过程中发生的异常。这种机制允许开发者在代码中指定一个或多个代码块,这些代码块在执行时如果抛出了异常,可以被立即捕获并进行相应的处理。

组成部分

  1. try块:包含可能会抛出异常的代码。如果try​块中的代码执行过程中抛出了异常,那么这个异常会被后续的catch​块捕获。
  2. catch块:用于捕获并处理特定的异常类型。可以有多个catch​块,每个catch​块处理不同类型的异常。catch​块的顺序很重要,因为Java会从上到下检查异常类型,一旦找到匹配的异常类型,就会执行相应的catch​块。
  3. finally块:无论是否发生异常,finally​块中的代码都会被执行。这通常用于执行清理操作,比如关闭文件流或释放资源,即使在try​块中发生了异常也是如此。

示例

public class Example {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[4]); // 这将抛出ArrayIndexOutOfBoundsException
        } catch (ArrayIndexOutOfBoundsException e) {
            System.err.println("数组越界异常:" + e.getMessage());
        } finally {
            System.out.println("无论是否发生异常,这段代码都会执行。");
        }
    }
}

2.3 throw

在 Java 中,throw​ 关键字用于显式地抛出异常。通过 throw​ 可以在代码中指定某个特定的异常被抛出,让调用者或者上层调用处理这个异常。

示例

public class ThrowExample {
  
    // 一个方法,当输入的参数小于0时抛出异常
    public void checkValue(int value) throws IllegalArgumentException {
        if (value < 0) {
            // 抛出IllegalArgumentException异常
            throw new IllegalArgumentException("Value cannot be negative.");
        }
        System.out.println("Value is valid: " + value);
    }

    public static void main(String[] args) {
        ThrowExample example = new ThrowExample();
        try {
            // 尝试使用一个负数调用checkValue方法
            example.checkValue(-10);
        } catch (IllegalArgumentException e) {
            // 捕获并处理抛出的IllegalArgumentException
            System.err.println("Caught an exception: " + e.getMessage());
        }
    }
}

在这个例子中,checkValue​方法接受一个整数参数。如果这个参数小于0,方法就会使用throw​关键字抛出一个IllegalArgumentException​异常。异常的构造函数中包含了一个错误消息,这个信息在异常被捕获时非常有用。

main​方法中,调用了checkValue​方法,并传递了一个负数。由于这个调用可能会抛出异常,我们使用try-catch​块来捕获和处理这个异常。在catch​块中,我们捕获了IllegalArgumentException​并打印了异常的消息。

2.4 throws

在Java中,throws​关键字用于在方法签名中声明该方法可能会抛出的异常。使用throws​可以让方法的调用者知道在执行该方法时可能会遇到哪些异常情况,并要求调用者对这些异常进行适当的处理。

  • 声明异常:使用throws​关键字在方法签名中声明方法可能会抛出的异常类型。
  • 责任转移:通过声明异常,方法将异常处理的责任转移给调用者,调用者需要捕获或进一步声明抛出这些异常。
  • 编译时检查:声明的异常类型必须是Exception​或其子类的实例,编译器会检查这些异常是否被适当地处理。

示例

public class ThrowsExample {

    // 声明一个可能会抛出IOException的方法
    public void readFile(String fileName) throws IOException {
        try {
            // 假设这里有读取文件的代码
            // 如果文件不存在或发生其他I/O错误,将抛出IOException
            throw new IOException("模拟文件读取异常");
        } catch (IOException e) {
            // 可以在这里处理异常,或者不处理,让异常被抛出
            throw e; // 重新抛出异常,让调用者处理
        }
    }

    public static void main(String[] args) {
        ThrowsExample example = new ThrowsExample();
        try {
            // 调用可能会抛出IOException的方法
            example.readFile("nonexistentfile.txt");
        } catch (IOException e) {
            // 捕获并处理IOException
            System.err.println("发生I/O异常:" + e.getMessage());
        }
    }
}

在这个示例中,readFile​方法声明它可能会抛出IOException​。这意味着调用readFile​的代码必须处理这个异常,要么通过try-catch​块捕获它,要么在自己的方法签名中使用throws​关键字进一步声明抛出这个异常。

三、自定义异常

3.1 简介

在Java中,自定义异常是指开发者根据特定需求创建的异常类。自定义异常通常用于表示特定的错误情况,这些情况可能不是由Java标准异常类覆盖的。自定义异常可以提供更清晰的错误信息,并且可以与应用程序的其他部分更紧密地集成。

自定义异常通常继承自以下两个类之一:

  • Exception​:如果你的自定义异常是可检查的(checked),即需要调用者显式处理的异常,它应该继承自Exception​类。
  • RuntimeException​:如果你的自定义异常是不可检查的(unchecked),即不需要调用者显式处理的异常,它应该继承自RuntimeException​类。

自定义异常类可以包含额外的方法和属性,以提供更多关于异常情况的信息。

3.2 示例

// 自定义异常类,继承自Exception
public class MyCustomException extends Exception {
    // 构造函数,接收错误消息
    public MyCustomException(String message) {
        super(message);
    }

    // 可以添加更多的构造函数,例如接收Throwable类型的cause
    public MyCustomException(String message, Throwable cause) {
        super(message, cause);
    }

    // 自定义方法,提供额外的错误信息
    public void printDetails() {
        System.out.println("Custom Exception Details: " + getMessage());
    }
}

// 使用自定义异常的类
public class ExampleUsage {
    public static void main(String[] args) {
        try {
            // 触发自定义异常
            throw new MyCustomException("Something went wrong!");
        } catch (MyCustomException e) {
            System.err.println("Caught an exception: " + e.getMessage());
            // 调用自定义方法
            e.printDetails();
        }
    }
}

在这个示例中,MyCustomException​是一个自定义异常类,它接收一个错误消息作为参数,并提供了一个额外的printDetails​方法来打印更多的错误信息。在ExampleUsage​类中,我们尝试抛出这个自定义异常,并在catch​块中捕获它,然后打印错误信息和详细信息。

自定义异常使得异常处理更加灵活和具体,有助于开发者更好地控制程序的异常流程和错误反馈。

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

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

相关文章

STM32 驱动直流无刷电机(BLDC)发声

STM32驱动直流无刷电机(BLDC)发声 ✨需要注意&#xff0c;这是驱动直流无刷电机(BLDC)发出声音&#xff0c;不是直接驱动无刷电机转动。 &#x1f4cd;内容移植参考&#xff1a;ttps://github.com/AlkaMotors/AM32-MultiRotor-ESC-firmware&#x1f4cd;Arduino平台BLDC Music开…

小程序开发入门:第一天的学习和实践指南

目录 一. 理解小程序的基本概念 1. 无需安装 2. 快速启动 3. 界面简洁 4. 独立性和封闭性 5. 数据安全 6. 框架结构 7. 生命周期 8. 全局配置 9. API支持 10. 发布和更新 二、选择合适的开发工具 1. 微信开发者工具 2. Visual Studio Code 3. Sublime Text 4. …

荣耀手机怎么录屏?荣耀手机录屏功能全解析

荣耀手机作为一款受欢迎的智能手机品牌&#xff0c;拥有丰富的功能和实用的工具&#xff0c;其中包括强大的录屏功能。然而&#xff0c;对于一些荣耀手机用户来说&#xff0c;如何利用这一功能可能会感到困惑。 在数字化时代&#xff0c;录制屏幕上的内容已成为许多用户分享、…

AOE网及其求解关键路径

全称 Activity on Edge Network 边活动网 特点 仅存在 有向无环图 作用 用于记录完成整个工程至少花费的时间 > 哪条路径最耗时&#xff1f;也就是“ 关键路径 ” AOE网元素介绍 关键活动 关键路径上的活动称为关键活动 &#xff0c; 关键活动是不允许拖延的&#x…

ctfshow-web入门-sql注入(web186-web190)

目录 1、web186 2、web187 3、web188 4、web189 5、web190 1、web186 新增过滤 \%|\<|\>|\^ 采用 regexp 正则表达式的方法来匹配&#xff0c;payload&#xff1a; ^ 表示匹配开头&#xff0c;也就是说我们猜测 flag 的第一个字符是 c tableNamectfshow_user gro…

sql注入——环境搭建以及sqli-labs闯关

1.简介 本文将详细介绍如何在Windows系统中使用PHPStudy搭建SQLi-Labs环境&#xff0c;在刚学习SQL注入的时候&#xff0c;都需要拥有一个能SQL注入的网站。因此我们一般都是在本地搭建一个能SQL注入测试的网站&#xff0c;而SQLi-Labs是一个精心设计的SQL注入学习平台。 2. …

无心剑七律《悼李政道先生》

七律悼李政道先生 苏州才俊志凌云&#xff0c;联大求知岁月勤 异域扬名赢诺奖&#xff0c;前沿探秘破迷群 基金倡导根基固&#xff0c;学子栽培事业殷 科教倾心功绩著&#xff0c;英名不朽铸奇文 2024年8月5日 平水韵十二文平韵 这首诗是一首悼念李政道先生的七律&#xff0c;无…

【隐私计算篇】混淆电路之深入浅出

入门隐私计算的阶段&#xff0c;一般都会涉及对于混淆电路的学习&#xff0c;这是因为混淆电路是多方安全计算中的基础密码原语&#xff0c;也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理&#xff0c;今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…

【2024华数杯】C题成品论文及代码

问题分析 1、问题一 针对问题一&#xff0c;为了解决此问题&#xff0c;我们需要利用 python 中的内置线性扫描算法 max遍历所有城市景点数据&#xff0c;寻到最高评分&#xff0c;检索每个城市中景点获评最高评分的数量&#xff0c;随后排序并列出前 10 个城市。 2、问题二&…

sqlilab本地靶场注入less-1~less-6

如何通过information_schema数据库查表名&#xff0c;列名 首先要了解mysql和mariadb数据库默认自带的tables有哪些&#xff1a; mariadb自带数据库 information_schema performance_schema mysql MySQL自带数据库 information_schema performance_schema mysql…

ubuntu执行git svn clone发生中断:APR does not understand this error code: ra serf

问题描述 在ubuntu中执行 git svn clone <url>的时候&#xff0c;出现如下报错&#xff1a; 即 ubuntu&#xff1a;APR does not understand this error code: ra serf: The server sent a truncated HTTPresponse body.解决方法 方法一&#xff1a;使用git svn fet…

C语言 | Leetcode C语言题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; static inline void swap(int *a, int *b) {int c *a;*a *b;*b c; }static inline int partitionAroundPivot(int left, int right, int pivot, int *nums) {int pivotValue nums[pivot];int newPivot left;swap(&nums[pivot], &a…

谈谈冯诺依曼体系

我们都知道冯诺依曼体系这张图最为代表性&#xff0c;而接下来我们就来浅谈一下各部分之间的作用~ 输入设备&#xff1a;键盘&#xff0c;磁盘&#xff0c;网卡&#xff0c;话筒等等 输出设备&#xff1a;磁盘&#xff0c;网卡&#xff0c;声卡&#xff0c;显示屏等等 这些硬件…

TiDE时间序列模型预测(Long-term Forecasting with TiDE: Time-series Dense Encoder)

时间序列预测&#xff0c;广泛用于能源、金融、交通等诸多行业&#xff0c;传统的统计模型&#xff0c;例如ARIMA、GARCH等因其简单高效而被广泛使用&#xff0c;近年来&#xff0c;随着深度学习的兴起&#xff0c;基于神经网络的预测模型也备受关注&#xff0c;表现出强大的预…

EHS行业趋势:2024年的EHS管理新动向

随着全球气候变化和资源枯竭等问题的日益严峻&#xff0c;企业对环境、健康与安全&#xff08;EHS&#xff09;管理的重视程度达到了前所未有的高度。特别是在“双碳”目标的推动下&#xff0c;绿色制造、ESG&#xff08;环境、社会与治理&#xff09;和可持续发展已成为企业的…

KAFKA-03-kafka 脚本命令使用详解

0&#xff1a;脚本总结 1、kafka-acls.sh #配置&#xff0c;查看kafka集群鉴权信息 2、kafka-configs.sh #查看&#xff0c;修改kafka配置3、kafka-console-consumer.sh #消费命令 4、kafka-console-producer.sh #生产命令 5、kafka-consumer-groups.sh #查看消费者组&#xf…

二百五十六、MySQL——MySQL新用户设置密码报错

一、目的 在执行脚本创建海豚调度器在MySQL中的数据库以及用户时&#xff0c;发现脚本执行报错 二、原先脚本内容 三、执行报错 [roothurys22 dolphinscheduler]# sh mysql-metastore.sh ------------ 在MySQL中创建元数据库及用户 ------------ mysql: [Warning] Using a…

9、springboot3 vue3开发平台-前端- vue3工程创建

1. 项目说明 技术选择&#xff1a; 使用vue3 TS ElementPlus&#xff0c; 开发使用vite构建 目的&#xff1a; 搭建管理系统框架&#xff0c; 包含动态路由&#xff0c; 动态菜单&#xff0c; 用户&#xff0c;角色&#xff0c; 菜单&#xff0c;权限管理&#xff0c;日志等…

《2024华数杯》C题第四问 模型建立+优化算法

第四问解决思路 目标 在144小时内&#xff0c;外国游客要尽可能游览更多的城市&#xff0c;同时要使门票和交通的总费用尽可能少。 模型与假设 点击获取代码思路文献数据 假设&#xff1a; ○ 游客在每个城市只游览一个评分最高的景点。 ○ 城市之间的交通方式只选择高铁。 ○…

Linux学习笔记9(Linux包管理)

目录 归档包管理 归档 查看归档包 解归档包 压缩包管理 Zip/unzip gzip/gunzip bzip2/bunzip2 源码包安装软件 三大步&#xff1a; 预备步骤&#xff1a;安装依赖的编译库 一、./configure --prefix/usr/local/nginx 二、make 三、make install 软件包安装 配置…