Java 异常处理中try-catch块、finally子句以及自定义异常的使用

news2024/11/16 23:42:42

Java 异常处理是 Java 语言中非常重要的一部分,用来处理程序运行过程中可能发生的各种异常情况,确保程序的稳定性和可靠性。

一、Java 异常处理概述

异常是程序运行过程中出现的非正常情况。Java 使用异常类(Exception 类及其子类)来表示这些异常情况。异常处理的核心思想是将正常的程序流程与异常处理流程分离开来,使代码更加清晰和可维护。

Java 中的异常体系结构如下:

  1. Throwable 类:所有异常和错误的基类。
  2. Error 类:表示系统级的错误,程序通常无法处理,比如内存不足(OutOfMemoryError)。
  3. Exception 类:表示程序中可以处理的异常情况。
    • RuntimeException 类:运行时异常,通常是编程错误导致的,如数组下标越界(ArrayIndexOutOfBoundsException)。
    • Checked Exception:非运行时异常,必须通过编译器检查,如文件未找到(FileNotFoundException)。

二、try-catch 块

try-catch 块用于捕获和处理异常。基本语法结构如下:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e1) {
    // 处理异常类型1
} catch (ExceptionType2 e2) {
    // 处理异常类型2
} finally {
    // 可选的,始终执行的代码块
}

示例

public class TryCatchExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 这会引发 ArithmeticException
        } catch (ArithmeticException e) {
            System.out.println("捕获到算术异常:" + e.getMessage());
        }
    }
}

在上面的示例中,try 块中的代码试图执行一个除零操作,这会引发 ArithmeticException。该异常被 catch 块捕获,并输出相应的错误信息。

三、finally 子句

finally 子句是异常处理机制中的一个重要组成部分,它用于执行一些清理操作,不管是否抛出异常,finally 块中的代码都会被执行。

示例
public class FinallyExample {
    public static void main(String[] args) {
        try {
            int[] array = new int[5];
            System.out.println(array[6]); // 这会引发 ArrayIndexOutOfBoundsException
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("捕获到数组越界异常:" + e.getMessage());
        } finally {
            System.out.println("无论是否发生异常,finally 块中的代码都会执行。");
        }
    }
}

在这个示例中,不管是否发生异常,finally 块中的代码都会被执行。

四、try-with-resources 语法

Java 7 引入了 try-with-resources 语法,用于简化资源管理,如文件、数据库连接等。这些资源实现了 AutoCloseable 接口,try-with-resources 语法会自动关闭这些资源。

示例
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class TryWithResourcesExample {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            System.out.println("捕获到 IO 异常:" + e.getMessage());
        }
    }
}

在这个示例中,BufferedReader 会在 try 块结束后自动关闭,不需要在 finally 块中显式关闭。

五、自定义异常

有时,我们需要创建自己的异常类来表示特定的错误情况。自定义异常类需要继承自 ExceptionRuntimeException

自定义异常类
public class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

使用自定义异常

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            validateAge(15);
        } catch (CustomException e) {
            System.out.println("捕获到自定义异常:" + e.getMessage());
        }
    }

    public static void validateAge(int age) throws CustomException {
        if (age < 18) {
            throw new CustomException("年龄必须大于或等于 18。");
        }
    }
}

在这个示例中,validateAge 方法检查年龄是否大于或等于 18,如果不满足条件,就抛出自定义的 CustomException

六、最佳实践

1. 尽量捕获具体的异常:尽量捕获具体的异常类型,而不是使用通用的 Exception,这样可以更好地处理不同类型的错误。

try {
    // 可能抛出多种异常的代码
} catch (FileNotFoundException e) {
    // 处理文件未找到异常
} catch (IOException e) {
    // 处理其他 IO 异常
}

2. 不要过度使用异常处理:异常处理机制是用来处理不可预见的错误情况,不要把正常的业务逻辑放到异常处理块中。

// 不推荐的做法
try {
    int result = Integer.parseInt("abc"); // 这会引发 NumberFormatException
} catch (NumberFormatException e) {
    System.out.println("输入格式错误");
}

// 推荐的做法
if (isNumeric("abc")) {
    int result = Integer.parseInt("abc");
} else {
    System.out.println("输入格式错误");
}

3. 使用 finally 块进行资源清理:确保在 finally 块中关闭资源,以防止资源泄漏。

FileInputStream fis = null;
try {
    fis = new FileInputStream("test.txt");
    // 读取文件的代码
} catch (IOException e) {
    // 处理 IO 异常
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            // 处理关闭流时的异常
        }
    }
}

4. 使用 try-with-resources:对于实现了 AutoCloseable 接口的资源,优先使用 try-with-resources 语法,以简化代码并确保资源自动关闭。

5. 自定义异常类要有意义:自定义异常类的名称和描述信息要能够明确地传达错误的具体含义。

Java 异常处理机制通过 try-catch 块、finally 子句、自定义异常等方式,为程序提供了强大的错误处理能力。在实际开发中,合理地使用异常处理机制,可以提高代码的稳定性和可维护性。

Java 异常处理机制的关键点总结如下:

  1. try-catch 块:用于捕获和处理异常。
  2. finally 子句:用于执行清理操作,无论是否发生异常都会执行。
  3. try-with-resources:用于自动管理实现了 AutoCloseable 接口的资源。
  4. 自定义异常:通过继承 ExceptionRuntimeException 创建自定义异常类,用于处理特定的错误情况。
  5. 最佳实践:尽量捕获具体的异常类型、不要过度使用异常处理、在 finally 块中进行资源清理、优先使用 try-with-resources、确保自定义异常类有明确的意义。

通过掌握这些技巧和最佳实践,可以有效地处理程序运行过程中可能出现的各种异常情况,从而提高程序的稳定性和可靠性。

黑马程序员免费预约咨询

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

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

相关文章

建WordPress主题官网模板

蓝色的中文WordPress企业模板 https://www.zhanyes.com/qiye/6305.html 暗红色WordPress律师事务所网站模板 https://www.zhanyes.com/qiye/23.html 红色大banner图WordPress外贸网站模板 https://www.zhanyes.com/waimao/27.html

【C语言】探索文件读写函数的全貌

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 &#x1f525;引言 本章将介绍文件读取函数的相关知识和展示使用场景&am…

AI自动化办公:批量将Excel表格英文内容翻译为中文

有一个50列的表格&#xff0c;里面都是英文&#xff0c;要翻译成中文&#xff1a; 在ChatGPT中输入提示词&#xff1a; 你是一个开发AI大模型应用的Python编程专家&#xff0c;要完成以下任务的Python脚本&#xff1a; 打开Excel文件&#xff1a;"F:\AI自媒体内容\AI行业…

harbor -- docker私有仓库安装配置

1 安装docker-compose $ curl -L "https://get.daocloud.io/docker/compose/releases/download/v1.25.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ chmod x /usr/local/bin/docker-compose 2 安装配置harbor $ wget https://g…

JS-51-Node.js10-yarn

一、yarn的简介 Yarn 是一款 JavaScript 的包管理工具&#xff08;npm的代替方案&#xff09;&#xff0c;是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具。 正如 Yarn 官网的介绍&#xff0c;Yarn 的具有速度快 、安全 、可靠 的优点&#x…

嘉立创使用gif

新建原理图 边框设置2 新建pcb图 放置焊盘 排列焊盘 新建符号 封号向导 新建封装 封装向导 符号与封装联结 原件查找 drc设计规则&#xff08;线之间的距离等 布线冲突 顶底层切换 T ,B 顶底连线&#xff0c;自动创造过孔 铺铜 泪滴 网格大小 吸附 元件库

民国漫画杂志《时代漫画》第33期.PDF

时代漫画33.PDF: https://url03.ctfile.com/f/1779803-1248635648-d8235b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

任何图≌自己这一几何最起码常识推翻直线公理让R外标准实数一下子浮出水面

黄小宁 h定理&#xff1a;点集AB≌B的必要条件是A≌B。 证&#xff1a;若AB则A必可恒等变换地变为BA≌A&#xff0c;而恒等变换是保距变换。证毕。 如图所示R轴即x轴各元点x沿x轴正向不保距平移变为点y2x就使x轴沿本身拉伸&#xff08;放大&#xff09;变换为y2x轴不≌x轴&…

PDF盖骑缝章

在PDF文件上加盖骑缝章&#xff0c;您可以采取以下几种方法之一&#xff1a; 使用Adobe Acrobat&#xff1a; 打开Adobe Acrobat软件&#xff0c;加载PDF文件。在工具栏选择“工具”选项&#xff0c;找到“骑缝章”或“印章”工具。选择或上传您的骑缝章图片&#xff0c;将其放…

区块链技术:金融行业的信任基石

一、引言 在数字化转型的浪潮中,区块链技术以其独特的优势,正逐渐成为金融行业的信任基石。本文将深入探讨区块链技术在金融行业的应用,通过具体案例的细化和完善,分析其特点和影响。 二、区块链技术的核心特点 1. 去中心化:区块链技术通过分布式账本,实现去中心化的数…

乡村振兴,教育先行:加强农村教育事业发展,提高农民素质,培育新时代新型农民,为美丽乡村建设提供人才保障

目录 一、引言 二、农村教育事业发展的重要性 1、提高农民素质&#xff0c;促进全面发展 2、推动农村经济社会发展 3、传承乡村文化&#xff0c;促进文化振兴 三、加强农村教育事业发展的策略 1、加大教育投入&#xff0c;改善教育设施 2、普及义务教育&#xff0c;提高…

栈和队列题目练习

本节小编选了两道题来加深对栈和队列的认识理解&#xff01; 有效的括号 方法1&#xff1a;直接用栈的结构&#xff08;动态数组&#xff09; 本题可以用栈这个结构来解答&#xff0c;将(,{,[ 左括号压入栈中&#xff0c;然后取出栈顶元素与右括号),},]匹配。不匹配的话&…

雅特力串口485模式TCDT/TSDT说明

TCDT&#xff08;发送器完成延迟时间&#xff08;transmit complete delay time&#xff09;占了5个bit位&#xff0c;则最大值为 2 5 − 1 31 2^{5} -1 31 25−131&#xff0c;时间单位是 1 16 波特率周期 \frac{1}{16}波特率周期 161​波特率周期 波特率为9600&#xff…

如何理解 Java 接口和抽象类的定义和使用场景

Java 是一种面向对象编程语言&#xff0c;提供了丰富的面向对象编程机制。其中&#xff0c;接口和抽象类是两个重要的概念&#xff0c;它们在设计和实现代码时扮演着关键的角色。 接口&#xff08;Interface&#xff09; 定义和特性 接口是 Java 中的一种引用数据类型&#…

神经网络与深度学习——第4章 前馈神经网络

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第4章 前馈神经网络 前馈神经网络 神经元 Sigmoid型函数 Hard-Logistic函数和Hard-Tanh函数 ReLU函数 带泄露的ReLU 带参数的ReLU ELU函数 Softplus函数 Swish函数 GELU函数 Maxout单元 网络结构 前馈网络…

JAVAEE之多线程进阶(2)_ CAS概念、实现原理、ABA问题及解决方案

前言 在并发编程时&#xff0c;常常会出现线程安全问题&#xff0c;那么如何保证原子性呢&#xff1f;常用的方法就是加锁。在Java语言中可以使用 Synchronized和CAS实现加锁效果。  Synchronized关键字保证同步的&#xff0c;这会导致有锁&#xff0c;但是锁机制存在以下问题…

当你想使用预测概率作为预测模型的结果

&#x1f31f;当你想使用预测概率作为医学预测模型的结果&#x1f31f; 分类预测模型的预测结果有两种。一种是直接判断是哪一类&#xff0c;这种情况下唯一可以调节的就是决策阈值&#xff0c;或者是默认的0.5&#xff0c;也可以是参数确定的决策阈值&#xff0c;比如约登指数…

ELK 使用 metricbeat监控数据

IP功能版本192.168.140.153elk-18.13.4192.168.140.153metricbeat8.13.4192.168.140.156elk-28.13.4192.168.140.156metricbeat8.13.4192.168.140.159logstash8.13.4192.168.140.159kibana8.13.4 一、安装ELK 参考文档&#xff1a; https://download.csdn.net/download/weix…

Spring 源码:深度解析AOP源码配置解析

文章目录 一、 解析AOP配置的入口1.1 从XML配置到AOP Namespace的解析流程1.2 分析注解驱动的AOP配置解析流程 二、AOP配置解析的核心流程2.1 ConfigBeanDefinitionParser 类2.2 parse()2.3 parseAdvisor()2.4 parseAspect()2.5 parsePointcut()2.6 createAdvisorBeanDefinitio…

CentOS 7基础操作02_优化Linux操作系统中的服务

1、实验环境 公司在文件服务器中新安装了CentOS系统.由于默认启动的服务程序较多&#xff0c;系统运行缓慢。现需要对系绞服务进行适当优化&#xff0c;减少一些不必要的自启动服务.并设置系统在开机后直接进入字符模式。 2、需求描述 根据实际使用需求对CentOS 7操作系统中的…