认识异常详解

1. 异常的定义:

在Java中,异常(Exception)是在程序执行过程中可能出现的错误或意外情况。异常可以分为两种类型:受检异常(Checked Exception)未受检异常(Unchecked Exception)

所谓异常,就是一个一个的类,他们之间存在着父子类关系,如下图所示:

2. 异常的分类: 

  1. 受检异常(Checked Exception)

    • 受检异常是指在编译时必须进行处理的异常。它们是 Exception 的子类(不包括 RuntimeException 和其子类),通常表示程序能够合理预料和处理的情况,如文件未找到、网络连接中断等。
    • 受检异常必须通过 try-catch 块或者在方法签名中使用 throws 关键字声明,否则编译器将报错。
  2. 未受检异常(Unchecked Exception)

    • 未受检异常也称为运行时异常(RuntimeException)及其子类。它们通常表示程序运行时出现的错误,如空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)等。
    • 未受检异常不要求显式地捕获或者声明,因为它们通常是由程序逻辑错误引起的,应该在代码中避免。

 受检异常:

特点和处理方式

  1. 必须处理或声明

    • 受检异常必须在代码中显式处理,否则编译器将会报错。这是Java编译器强制执行的规定,以保证程序在可能出现问题的地方有预防措施。
  2. 常见的受检异常

    • IOException:处理输入输出流时可能抛出的异常,如文件未找到、文件读写错误等。
    • SQLException:操作数据库时可能抛出的异常。
    • ClassNotFoundException:试图加载类时找不到该类时抛出的异常。
    • FileNotFoundException:尝试打开一个不存在的文件时抛出的异常。
  3. 异常处理方式

    a. 使用 try-catch 块

try {// 可能抛出受检异常的代码块FileReader file = new FileReader("file.txt");// 其他可能抛出异常的操作
} catch (FileNotFoundException e) {// 处理异常的代码e.printStackTrace();
} catch (IOException e) {// 处理其他IO异常的代码e.printStackTrace();
}

 

  • 在 try 块中放置可能抛出异常的代码,每个 catch 块用于捕获不同类型的异常,并在捕获到异常后执行相应的处理逻辑。

b. 使用 throws 关键字抛出异常

  • 方法签名中使用 throws 关键字声明方法可能抛出的受检异常。这样做可以将异常向上层调用者传递,由调用者处理。
public void readFile() throws IOException, FileNotFoundException {FileReader file = new FileReader("file.txt");// 其他可能抛出异常的操作
}
    • 调用 readFile() 方法时,调用者必须要么在其内部使用 try-catch 块处理异常,要么在其方法签名中继续向上抛出异常。
  1. 适用场景

    • 当方法中有可能出现会影响程序正常运行的情况时,应该使用受检异常。这种异常通常要求程序员预见可能的问题,并在代码中进行相应的处理,以保证程序的稳定性和可靠性。
  2. 最佳实践

    • 在处理受检异常时,建议不仅仅是简单地打印堆栈信息,而是根据具体情况采取适当的措施,比如向用户报告错误、进行重试、回滚操作等,以便尽可能地恢复正常的程序执行状态。

未受检异常:

特点和处理方式

  1. 不需要显式处理或声明

    • Java编译器不会强制要求在代码中捕获或声明未受检异常,这使得程序员在处理逻辑上更加灵活,但也需要注意避免因未捕获的异常导致程序意外终止。
  2. 常见的未受检异常

    • NullPointerException:当引用为空(null)时尝试调用其方法或访问其属性时抛出。
    • ArrayIndexOutOfBoundsException:尝试访问数组中不存在的索引位置时抛出。
    • ArithmeticException:数学运算异常,如除以零。
    • IllegalArgumentException:方法接收到非法参数时抛出。
    • ClassCastException:类型转换异常,在类型转换时发生类型不兼容时抛出。
  3. 异常处理方式

    • 尽管未受检异常不要求强制处理,但好的编程实践是在可能引发这些异常的地方进行适当的逻辑检查,以避免程序出现异常状态。
    • 如果未捕获的未受检异常发生,通常会导致程序异常终止,并打印异常堆栈信息,这可以帮助定位问题所在。
  4. 适用场景

    • 未受检异常通常表示程序员在代码逻辑中出现了错误或者未能预料到的情况。例如,当方法要求传入的参数为非空时却接收到了空值,可以抛出 NullPointerException。这种异常通常需要通过改进代码逻辑来避免,而不是依赖于异常处理机制。
  5. 最佳实践

    • 在编写代码时,应该注意对可能导致未受检异常的情况进行检查和预防,尽量避免程序运行时因为这类异常而意外终止。
    • 对于可能引发未受检异常的方法,可以通过文档、注释或者断言等手段来说明其预期的使用条件,以便其他开发人员正确使用。

3. 异常的处理:

捕获异常(try-catch)

  • 使用 try 块包裹可能会引发异常的代码,然后通过 catch 块捕获特定类型的异常并处理它们。
try {// 可能抛出异常的代码块int result = 10 / 0; // 这里会抛出 ArithmeticException
} catch (ArithmeticException e) {// 处理算术异常的代码System.out.println("除数不能为零");
} catch (Exception e) {// 捕获其他类型的异常e.printStackTrace();
}
  • try 块中的代码在执行时,如果抛出了 ArithmeticException 异常(例如除以零),程序会跳到对应的 catch 块中执行处理逻辑。

 

抛出异常(throw)

  • 当方法内部无法处理某些异常情况时,可以使用 throw 关键字显式地抛出异常对象,将异常传递给调用者处理。
public void withdraw(double amount) throws InsufficientFundsException {if (amount > balance) {throw new InsufficientFundsException("余额不足");}// 执行取款操作balance -= amount;
}
  • 在上述例子中,如果取款金额大于账户余额,则抛出自定义的 InsufficientFundsException 异常。

  • 使用 finally 块

    FileInputStream file = null;
    try {file = new FileInputStream("file.txt");// 读取文件
    } catch (FileNotFoundException e) {e.printStackTrace();
    } finally {// 关闭文件流,确保资源得到释放if (file != null) {try {file.close();} catch (IOException e) {e.printStackTrace();}}
    }

  • finally 块用于执行无论是否发生异常都需要执行的代码,比如资源释放操作(如关闭文件、数据库连接等)。

使用 try-with-resources(Java 7+):

  • 当需要处理的资源实现了 AutoCloseable 或 Closeable 接口时,可以使用 try-with-resources 语句自动关闭资源。
try (FileInputStream file = new FileInputStream("file.txt")) {// 读取文件
} catch (IOException e) {e.printStackTrace();
}
  • 在 try 后面的括号中声明资源,程序结束时会自动调用其 close() 方法,无需手动关闭资源。

异常处理的最佳实践

  • 选择合适的异常处理方式:根据具体情况选择 try-catchthrowfinally 或 try-with-resources 等方式。
  • 准确捕获异常:捕获尽可能具体的异常类型,避免过于宽泛的 catch (Exception e) 形式。
  • 避免捕获过多:尽可能在能够预见和处理异常的地方捕获和处理,而不是在整个应用程序的最高层捕获所有异常。
  • 异常信息的处理:合理利用异常信息提供的堆栈信息,帮助调试和定位问题。
  • 保持代码清晰:异常处理应与正常逻辑分开,保持代码的清晰和可读性。

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

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

相关文章

【linux学习---1】点亮一个LED是多么的困难!!!

文章目录 1、原理图找对应引脚2、IO复用3、IO配置4、GPIO配置5、GPIO时钟使能6、总结7、编程8、编译9、链接10、格式转换11、反汇编(查看用)12、使用Makefile操作13、代码烧写14、代码验证 1、原理图找对应引脚 从上图 可以看出, 蜂鸣器 接到…

固态,机械,移动(U盘),sd卡,哪个更适合长期储存数据 保存数据用什么硬盘可靠 硬盘数据丢失怎么找回 硬盘维护注意事项

有关硬盘数据丢失的恢复技巧,这篇文章一定要收藏好。在硬盘使用过程中,很多情况都会导致数据丢失,例如硬盘跌落、病毒感染、系统文件损坏等。这时候,一定要采用正确的方法,抢救硬盘中存储的珍贵数据和文档。 有关长期保…

PO模式简介

V1顺序型:不能批量运行 import unittest from selenium import webdriver from time import sleep driver webdriver.Edge()# driver.maximize_window() driver.implicitly_wait(30) # driver.get(r"https://demo5.tp-shop.cn/") # driver.find_element…

Python 获取tiktok视频评论回复数据 api接口

TIKTOK api接口 用于爬取tiktok视频评论回复数据 详细采集页面如图 https://www.tiktok.com/dailymail/video/7329872821990182190?qneural%20link&t1706783508149 请求API http://api.xxxx.com/tt/video/info/comment/reply?video_id7288909913185701125&comment_…

【C++】指针的点运算与箭头运算(->)的奥秘与应用

在编程的世界里,指针作为连接程序与内存之间的桥梁,扮演着至关重要的角色。对于使用C、C等语言进行开发的程序员而言,理解并掌握指针的使用技巧是提升编程能力的必经之路。其中,指针的点运算(.)和箭头运算&…

Android系统集成和使用FFmpeg

文章目录 前言FFmpeg源码下载交叉编译NDK下载x264编译源码下载编译 FFmpeg编译脚本 AOSP继承FFmpeg 前言 原生AOSP中并未继承FFmpeg,所以要想在android上使用,需要自己编译集成。 FFmpeg源码下载 git clone https://git.ffmpeg.org/ffmpeg.git目前最新…

自动化测试报告pytest-html样式美化

最近我将 pytest-html 样式优化了 一版 先看优化前: 优化后: 优化内容包括: 删除部分多余字段新增echart图表部分字体大小、行间距、颜色做了美化调整运行环境信息移至报告最后部分字段做了汉化处理(没全部翻译是因为&#xf…

vue3 引入百度地图的三种方式

本次也是正好写了一个基于VUE3和百度地图的设计,但奈何第一次使用百度地图,在学习的途中遇到了很多问题,也发现网上的材料相对较少,因此做出了一些小总结,后续还会更新。 一、直接引入 直接在public中的index.html中进…

[FreeRTOS 功能应用] 事件组 功能应用

文章目录 一、基础知识点二、代码讲解三、结果演示四、代码下载 一、基础知识点 [FreeRTOS 基础知识] 事件组 概念 [FreeRTOS 内部实现] 事件组 本实验是基于STM32F103开发移植FreeRTOS实时操作系统,事件组实战操作。(当task1和task2同时完成,才执行ta…

二维Gamma分布的激光点云去噪

目录 1、Gamma 分布简介2、实现步骤 1、Gamma 分布简介 Gamma 分布在合成孔径雷达( Synthetic Aperture Radar,SAR) 图像分割中具有广泛应用,较好的解决了SAR 图像中相干斑噪声对图像分割的影响。采用二维Gamma 分布对…

web前端开发——开发环境和基本知识

今天我来针对web前端开发讲解一些开发环境和基本知识 什么是前端 前端通常指的是网站或者Web应用中用户可以直接与之交互的部分,包括网站的结构、设计、内容和功能。它是软件开发中的一个专业术语,特别是指Web开发领域。前端开发涉及的主要技术包括HTML…

昇思25天学习打卡营第15天|linchenfengxue

Pix2Pix实现图像转换 Pix2Pix概述 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型,该模型是由Phillip Isola等作者在2017年CVPR上提出的,可以实现语义/标签到…

Java常用算法集合扩容机制分析

基础篇 基础篇要点:算法、数据结构、基础设计模式 1. 二分查找 要求 能够用自己语言描述二分查找算法能够手写二分查找代码能够解答一些变化后的考法 算法描述 前提:有已排序数组 A(假设已经做好) 定义左边界 L、右边界 R&…

东芝TB6560AHQ/AFG步进电机驱动IC:解锁卓越的电机控制性能

作为一名工程师,一直在寻找可靠且高效的组件来应用于你的项目中。东芝的TB6560AHQ/AFG步进电机驱动IC能够提供精准且多功能的电机控制,完全符合现代应用的高要求,保证高性能和易用性。在这篇文章中,我们将探讨TB6560AHQ/AFG的主要…

硅纪元视角 | 国内首款鸿蒙人形机器人“夸父”开启应用新篇章

在数字化浪潮的推动下,人工智能(AI)正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展,捕捉行业动态;提供深入的新闻解读,助您洞悉技术背后的逻辑;汇聚行业专家的见解,…

es6新语法

es6新语法 1 什么是ES6 JS语法分三块 ECMAScript : 基础语法BOM 浏览器对象 history location windowDOM 文档对象 document 编程语言JavaScript是ECMAScript的实现和扩展 。ECMAScript是由ECMA(一个类似W3C的标准组织)参与进行标准化的语法规范。ECMAS…

医疗器械企业CRM系统推荐清单(2024版)

近年来,我国医疗器械行业在国家政策支持、医改深入、人口老龄化和消费能力提升等因素推动下,得到了快速发展,正日益成为创新能力增强、市场需求旺盛的朝阳产业。然而,行业也面临价格压力、市场份额重新分配、合规风险以及产品和服…

解决 MEX 文件 ‘xxx.mexw64‘ 无效: 找不到指定的模块。的问题

1.问题描述 在matlab R2021b中运行编译好后的gptoolbox工具箱中的函数[SVtemp,SFtemp,IF] selfintersect(V,F);报错如下 MEX 文件 E:\MATLAB_File\gptoolbox\mex\selfintersect.mexw64 无效: 找不到指定的模块。出错 offset_bunny (第 15 行) [SVtemp,SFtemp,IF] selfinter…

论文略读:Learning and Forgetting Unsafe Examples in Large Language Models

随着发布给公众的大语言模型(LLMs)数量的增加,迫切需要了解这些模型从第三方定制的微调数据中学习的安全性影响。论文研究了在包含不安全内容的噪声定制数据上微调的LLMs的行为,这些数据集包含偏见、毒性和有害性 发现虽然对齐的L…

3033. 修改矩阵 Easy

给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix ,新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等,接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。 返回矩阵 answer 。 示例 1: 输入:…