深入理解Java异常:检查型与非检查型异常的区别与实践

news2024/11/22 14:36:35

目录

一、Java异常的基本概念

二、检查型异常与非检查型异常的区别

1. 检查型异常(Checked Exception)

2. 非检查型异常(Unchecked Exception)

三、检查型与非检查型异常的代码示例

1. 检查型异常示例

2. 非检查型异常示例

四、如何选择和使用异常

五、总结


在Java开发中,异常处理是不可或缺的一部分。异常机制不仅可以让程序更健壮,还能帮助开发者迅速定位和修复错误。Java中的异常分为两类:检查型异常(Checked Exception)非检查型异常(Unchecked Exception)。这两种异常有着不同的使用场景和特点,理解它们对于编写高质量代码至关重要。

本文将从以下几个方面深入剖析检查型异常和非检查型异常:

  1. 异常的基本概念
  2. 检查型异常与非检查型异常的区别
  3. 实际代码示例
  4. 如何合理选择和使用异常

一、Java异常的基本概念

在Java中,所有的异常都继承自Throwable类,根据是否需要强制处理,可以分为以下两类:

  1. 检查型异常(Checked Exception):必须显式处理(例如:使用try-catch或声明throws)。
  2. 非检查型异常(Unchecked Exception):无需强制处理,可根据需要选择处理或忽略。

Java的异常层次结构如下:

  • Throwable
    • Error(一般由JVM抛出,开发者无需处理)
    • Exception
      • 检查型异常(继承自Exception,如IOException
      • 非检查型异常(继承自RuntimeException,如NullPointerException

二、检查型异常与非检查型异常的区别

1. 检查型异常(Checked Exception)

检查型异常是编译时异常,Java编译器会强制开发者处理这些异常。
特点

  • 必须使用try-catch块捕获,或者通过throws声明抛出。
  • 通常用于程序外部的错误,例如文件读写失败、数据库连接失败等。

常见检查型异常

  • IOException
  • SQLException
  • FileNotFoundException
2. 非检查型异常(Unchecked Exception)

非检查型异常是运行时异常,编译器不会强制要求开发者处理。
特点

  • 不强制捕获,程序在运行时可能直接抛出异常并中断。
  • 通常是程序逻辑错误引起,例如空指针访问或数组越界。

常见非检查型异常

  • NullPointerException
  • ArrayIndexOutOfBoundsException
  • ArithmeticException

三、检查型与非检查型异常的代码示例

1. 检查型异常示例

以下是一个检查型异常的典型用例:文件读取操作。

import java.io.*;

public class CheckedExceptionExample {
    public static void main(String[] args) {
        // 定义文件路径
        String filePath = "example.txt";
        try {
            // 尝试读取文件
            BufferedReader reader = new BufferedReader(new FileReader(filePath));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到:" + e.getMessage());
        } catch (IOException e) {
            System.out.println("文件读取出错:" + e.getMessage());
        }
    }
}

在上面的代码中:

  • 文件可能不存在(FileNotFoundException)。
  • 文件读取可能出错(IOException)。 因此,必须使用try-catch块处理这些检查型异常,否则代码无法通过编译。

2. 非检查型异常示例

以下是一个非检查型异常的用例:除零操作。

public class UncheckedExceptionExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        try {
            // 数组越界
            System.out.println("第4个元素是:" + numbers[3]);
            // 除零操作
            int result = 10 / 0;
            System.out.println("结果是:" + result);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界错误:" + e.getMessage());
        } catch (ArithmeticException e) {
            System.out.println("数学运算错误:" + e.getMessage());
        }
    }
}

在上面的代码中:

  • numbers[3]会抛出ArrayIndexOutOfBoundsException
  • 10 / 0会抛出ArithmeticException

这些异常是非检查型异常,程序运行时才会抛出,并且开发者可以选择是否处理。


四、如何选择和使用异常

  1. 什么时候使用检查型异常?

    • 处理外部资源(如文件、网络、数据库)时。
    • 希望调用者必须显式处理异常。
    • 示例:IOExceptionSQLException
  2. 什么时候使用非检查型异常?

    • 处理程序逻辑错误(如空指针、非法参数)。
    • 希望调用者自行决定是否捕获异常。
    • 示例:IllegalArgumentExceptionNullPointerException
  3. 最佳实践

    • 只在必要时抛出检查型异常,避免滥用导致代码冗长。
    • 对于非检查型异常,确保程序逻辑尽可能避免触发。
    • 编写清晰的异常信息,便于问题定位。

五、总结

通过本文的学习,我们对检查型异常和非检查型异常有了更深入的理解:

  1. 检查型异常用于外部错误,必须显式处理。
  2. 非检查型异常用于程序逻辑错误,无需强制捕获。
  3. 合理使用异常机制可以提高代码的健壮性和可读性。

掌握这两种异常的区别与用法,能够帮助你在Java开发中更加游刃有余!希望本文能为你提供帮助,也欢迎你分享你的看法和经验。

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

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

相关文章

Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程

环境: keil版本为5.38,版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址:https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译,会报很多错,先不管。 二、更改头文件依赖 观察…

数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall

数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 贵在坚持! 数据样例项目地址: * 相关项目 1)数据集可视化项…

Linux驱动编程 - kmalloc、vmalloc区别

目录 前言: 1、区别 2、使用差异 一、kmalloc、kzalloc、kfree 1、动态申请 1.1 kmalloc() 1.2 kzalloc() 2、内存释放 3、示例 二、vmalloc、vzalloc、vfree 1、动态申请 1.1 vmalloc() 1.2 vzalloc() 2、内存释放 3、示例 前言: Linux内…

使用低成本的蓝牙HID硬件模拟鼠标和键盘来实现自动化脚本

做过自动化脚本的都知道,现在很多传统的自动化脚本方案几乎都可以被检测,比如基于root,adb等方案。用外置的带有鼠标和键盘功能集的蓝牙HID硬件来直接点击和滑动是非常靠谱的方案,也是未来的趋势所在。 一、使用蓝牙HID硬件的优势…

VideoCrafter模型部署教程

一、介绍 VideoCrafter是一个功能强大的AI视频编辑和生成工具,它结合了深度学习和机器学习技术,为用户提供了便捷的视频制作和编辑体验。 系统:Ubuntu22.04系统,显卡:4090,显存:24G 二、基础…

#渗透测试#SRC漏洞挖掘#Python自动化脚本的编写05之多线程与多进程

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

C++多继承:一个子类继承多个父类的情况

C的类继承大家还算比较了解。它主要包括单继承、多继承、虚继承这几方面。 单继承就是一个子类只继承一个父类,多继承就是一个子类继承多个父类。 其实在C中,一个子类继承多个父类的情况还是比较常见的。比如,一个子类需要同时继承两个父类…

在windows电脑上安装docker服务

以下是在 Windows 电脑上安装 Docker 服务的详细步骤: 一、下载 Docker Desktop for Windows 系统要求:Windows 操作系统需要是 Windows 10(64 位)专业版、企业版或教育版,或者是 Windows 11。并且系统要开启了硬件虚…

单片机UART协议相关知识

概念 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器) 是一种 异步 串行 全双工 通信协议,用于设备一对一进行数据传输,只需要两根线(TX,RX)。 异步&…

XXL-JOB执行任务的SpringBoot程序无法注册到调度中心

文章目录 1. 问题呈现2. 问题产生的原因2.1 原因一:执行器和调度中心部署在不同的机器上2.2 原因二:调度中心部署在云服务器上 3. 解决方法3.1 方法一:将执行器和调度中心部署在同一台机器上3.2 方法二:手动指定执行器的ip地址&am…

Ettus USRP X410

总线连接器: 以太网 RF频率范围: 1 MHz 至 7.2 GHz GPSDO: 是 输出通道数量: 4 RF收发仪瞬时带宽: 400 MHz 输入通道数量: 4 FPGA: Zynq US RFSoC (ZU28DR) 1 MHz to 7.2 GHz,400 MHz带宽,GPS驯服OCXO,USRP软件无线电设备 Ettus USRP X410集…

哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性

文章目录 哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性网站的基本情况SEO优化分析与建议1. 元数据优化2. 关键词优化3. URL结构4. 图像优化5. 移动端优化6. 网站速度7. 结构化数据(Schema Markup)8. 内链与外链9. 社交分享 哋它亢SEO…

将网站地址改成https地址需要哪些材料

HTTPS(安全超文本传输协议)是HTTP协议的扩展。它大大降低了个人数据(用户名、密码、银行卡号等)被拦截的风险,还有助于防止加载网站时的内容替换,包括广告替换。 在发送数据之前,信息会使用SSL…

mongodb多表查询,五个表查询

需求是这样的,而数据是从mysql导入进来的,由于mysql不支持数组类型的数据,所以有很多关联表。药剂里找药物,需要药剂与药物的关联表,然后再找药物表。从药物表里再找药物与成分关联表,最后再找成分表。 这里…

端到端的专线管理与运维:实时掌握专线的运行状态

在当今高度信息化的时代,专线服务已成为企业数据传输的重要组成部分。为了确保专线服务的高效、稳定运行,我们采用了先进的端到端管理模式,对专线的运行状态和质量进行全面监控。本文将从专线管理的必要性、端到端管理模式的优势、实施步骤以…

SpringBoot(8)-任务

目录 一、异步任务 二、定时任务 三、邮件任务 一、异步任务 使用场景:后端发送邮件需要时间,前端若响应不动会导致体验感不佳,一般会采用多线程的方式去处理这些任务,但每次都需要自己去手动编写多线程来实现 1、编写servic…

PostgreSQL常用字符串函数与示例说明

文章目录 coalesce字符串位置(position strpos)字符串长度与大小写转换去掉空格(trim ltrim rtrim)字符串连接(concat)字符串替换简单替换(replace)替换指定位置长度(overlay)正则替换(regexp_replace) 字符串匹配字符串拆分split_part(拆分数组取指定位置的值)string_to_array…

深入剖析Java内存管理:机制、优化与最佳实践

🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 深入剖析Java内存管理:机制、优化与最佳实践 一、Java内存模型概述 1. Java内存模型的定义与作…

【论文速读】| RobustKV:通过键值对驱逐防御大语言模型免受越狱攻击

基本信息 原文标题:ROBUSTKV: DEFENDING LARGE LANGUAGE MODELS AGAINST JAILBREAK ATTACKS VIA KV EVICTION 原文作者:Tanqiu Jiang, Zian Wang, Jiacheng Liang, Changjiang Li, Yuhui Wang, Ting Wang 作者单位:Stony Brook University…

css使用弹性盒,让每个子元素平均等分父元素的4/1大小

css使用弹性盒,让每个子元素平均等分父元素的4/1大小 原本: ul {padding: 0;width: 100%;background-color: rgb(74, 80, 62);display: flex;justify-content: space-between;flex-wrap: wrap;li {/* 每个占4/1 */overflow: hidden;background-color: r…