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

目录

一、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.mzph.cn/news/886980.shtml

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

相关文章

C++初始化成员列表

1.介绍: 初始化成员列表是 C 中的一种构造函数语法,允许在对象构造时直接初始化类的成员变量,而不是先默认初始化再赋值 2.用法: ClassName(参数列表) : 成员1(参数1), 成员2(参数2), ... {// 构造函数体 }(1&#…

Django一分钟:django中收集关联对象关联数据的方法

场景:我有一个模型,被其它多个模型关联,我配置了CASCADE级联删除,我想要告知用户删除该实例之后,哪些关联数据将会被一同删除。 假设我们当前有这样一组模型: class Warehouse(models.Model):""…

统计班级中的说谎者(字节青训)

题目 班里有 N 个学生&#xff0c;第 i 个学生的分数是 A_i。当且仅当分数 < A_i 的学生数量多于分数比他高的数量时&#xff0c;第 i 个学生会说谎。求出有多少学生会说谎。 输入格式 输入 N 学生的成绩&#xff0c;包含 A_1, A_2, ..., A_N 输出格式 对于每组数据&am…

卷积神经网络各层介绍

目录 1 卷积层 2 BN层 3 激活层 3.1 ReLU&#xff08;Rectified Linear Unit&#xff09; 3.2 sigmoid 3.3 tanh&#xff08;双曲正切&#xff09; 3.4 Softmax 4 池化层 5 全连接层 6 模型例子 1 卷积层 卷积是使用一个卷积核&#xff08;滤波器&#xff09;对矩阵进…

【工控】线扫相机小结 第四篇

背景 这一片主要是对第三篇继续补充。话说上一篇讲到了两种模式的切换&#xff0c;上一篇还遗留了一个Bug&#xff0c;在这一篇里进行订正&#xff01; 代码回顾 /// <summary>/// 其实就是打开触发/// </summary>void SetLineSacanWorkMode(){-----首先设置为帧…

MySql面试题.运维面试题之五

《(全国)MySQL数据库DBA测试题-第1套》 卷面总分 题号 单选题 多选题 判断题 100 题分 42 40 18 得分 一、单选题(每题3分,共计42分;得分____) 1. 二进制rpm包安装的mysql数据库,默认的数据文件存放在如下哪个目录里? A、/usr/local/mysql B、/tmp/ C、/var/lib/my…

AI 大模型重塑软件开发的未来

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【软考】系统架构设计师-计算机系统基础(4):计算机网络

计算机网络功能&#xff1a;数据通信、资源共享、管理集中化、分布式处理、负载均衡 5G高峰速率&#xff1a;10Gbit/s 广域网&#xff08;因特网&#xff09;/城域网/局域网&#xff08;以太网&#xff09; 总线型&#xff1a;利用率低&#xff0c;易冲突&#xff0c;干扰大…

Ultiverse 和web3新玩法?AI和GameFi的结合是怎样

Gamef 和 AI 是我们这个周期十分看好两大赛道之一&#xff0c;(Gamef 拥有极强的破圈效应&#xff0c;引领 Web2 用户进军 Web3 最佳利器。AI是这个周期最热门赛道&#xff0c;无论 Web2的 OpenAl&#xff0c;还是 Web3&#xff0c;都成为话题热议焦点。那么结合 GamefiA1双叙事…

Matlab多输入单输出之倾斜手写数字识别

本文主要介绍使用matlab构建多输入单输出的网络架构&#xff0c;来实现倾斜的手写数字识别&#xff0c;使用concatenationLayer来拼接特征&#xff0c;实现网络输入多个特征。 1.加载训练数据 加载数据&#xff1a;手写数字的图像、真实数字标签和数字顺时针旋转的角度。 lo…

R | 统一栅格数据的坐标系、分辨率和行列号

各位同学&#xff0c;在做相关性等分析时&#xff0c;经常会遇到各栅格数据间的行列号不统一等问题&#xff0c;下面的代码能直接解决这类麻烦。以某个栅格数据的坐标系、分辨率和行列号为准&#xff0c;统一文件夹内所有栅格并输出到新的文件夹。 代码只需要更改输入输出和ti…

分布式缓存 + 数据存储 + 消息队列知识体系

文章目录 1. 分布式缓存的原理和技术2. 数据存储3. 数据的备份、恢复、迁移4. 项目案例分析5. 消息队列的原理和技术6. 消息队列的高级特性7. 项目案例分析 1. 分布式缓存的原理和技术 分布式缓存&#xff1a;分布式缓存是一种将数据存储在网络中的多个节点上的技术&#xff0c…

Nginx配置多前端,页面刷新404

nginx配置前端页面使用如下 location / {root /usr/share/nginx/html/zhtj;index index.html index.htm;} 但是这种页面刷新时候会显示404&#xff0c;解决办法如下 location / {root /usr/share/nginx/html/zhtj;index index.html index.htm;try_files $uri $uri/ /ind…

UE5 第一人称射击项目学习(完结)

这个项目几乎完结了。 也算我上手的第一个纯蓝图小项目。 现在只剩下缝缝补补了。 之前把子弹设计为蓝图&#xff0c;这里要引入C的面向对象思想&#xff0c;建立成员函数。 首先双击打开子弹的蓝图 这边就可以构造成员函数 写一个print your name 在这里生成成员函数后&am…

【前端知识】简单讲讲什么是微前端

微前端介绍 一、定义二、背景三、核心思想四、基本要素五、核心价值六、实现方式七、应用场景八、挑战与解决方案 什么是single-spa一、核心特点二、核心原理三、应用加载流程四、最佳实践五、优缺点六、应用场景 什么是 qiankun一、概述二、特点与优势三、核心功能四、使用场景…

三相正弦交流电的相序:揭秘正相序与反相序的奥秘

在电力系统中&#xff0c;三相正弦交流电的应用无处不在&#xff0c;从家庭用电到大型工业设备&#xff0c;都离不开它的稳定供电。然而&#xff0c;在三相交流电中&#xff0c;有一个概念常常让初学者感到困惑&#xff0c;那就是“相序”。今天&#xff0c;我们就来深入探讨一…

力扣面试题 - 24 插入

题目&#xff1a; 给定两个整型数字 N 与 M&#xff0c;以及表示比特位置的 i 与 j&#xff08;i < j&#xff0c;且从 0 位开始计算&#xff09;。 编写一种方法&#xff0c;使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域&#xff0c;不足之处用 0 补齐…

C07.L07.STL之映射.应用2.统计数字

题目描述 某次科研调查时得到了 n 个自然数&#xff0c;每个数均不超过 1500000000 (1.5*10^9 )。已知不相同的数不超过 10000 个&#xff0c;现在需要统计这些自然数各自出现的次数&#xff0c;并按照自然数从小到大的顺序输出统计结果。 输入格式 包含 2 行&#xff1a; 第…

华为云容器监控平台

首先搜索CCE,点击云容器引擎CCE 有不同的测试&#xff0c;生产&#xff0c;正式环境 工作负载--直接查询服务名看监控 数据库都是走的一个 Redis的查看

Spring Cloud Stream实现数据流处理

1.什么是Spring Cloud Stream&#xff1f; 我看很多回答都是“为了屏蔽消息队列的差异&#xff0c;使我们在使用消息队列的时候能够用统一的一套API&#xff0c;无需关心具体的消息队列实现”。 这样理解是有些不全面的&#xff0c;Spring Cloud Stream的核心是Stream&#xf…