深入理解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,一经查实,立即删除!

相关文章

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

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

卷积神经网络各层介绍

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

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

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

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…

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

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

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

在电力系统中&#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 补齐…

华为云容器监控平台

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

Spring Cloud Stream实现数据流处理

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

Notepad++--在开头快速添加行号

原文网址&#xff1a;Notepad--在开头快速添加行号_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Notepad怎样在开头快速添加行号。 需求 原文件 想要的效果 方法 1.添加点号 Alt鼠标左键&#xff0c;从首行选中首列下拉&#xff0c;选中需要添加序号的所有行的首列&#xff…

【ROS2】多传感器融合、实现精准定位:robot_localization

1、简述 robot_localization在SLAM建图、导航中常用于将多个传感器融合(IMU、里程计、深度相机、GPS等),以提高定位精度,为机器人提供了在三维空间中的非线性状态估计 robot_localization包含两个状态估计节点: ekf_localization_node:扩展卡尔曼滤波(EKF),缺点是非…

【智谱开放平台-注册_登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

永夜星河主题特效2(星河背景 + 闪烁文字+点击星星 + 文字弹出特效)

目录 图片展示 星河背景 闪烁文字点击星星 文字弹出特效 特效介绍&#xff1a; 使用方式&#xff1a; 图片展示 星河背景 闪烁文字点击星星 文字弹出特效 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">&l…

SAP Ariba Contracts_Author the Main Agreement

SAP Ariba Contracts_Author the Main Agreement Workspace Documents 从SAP Ariba 项目模板中继承的文档将自动出现在控件的“文档”选项卡中项目&#xff0c;Workspace Documents 管理所有合同相关文件的地方&#xff0c;如主要协议&#xff0c;附录&#xff0c;合同条款等…

C++练习题(5)

//函数打印素数 #include <iostream> using namespace std; int is_prime(int n){ for(int j2;j<n;j){ if(n%j0) return 0; } return 1; } int main(){ int i0; for(int i100;i<200;i){ if(is_prime(i)1) pr…

编程之路,从0开始:动态内存管理

Hello&#xff0c;大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路。 我们今天来学习C语言中的动态内存管理。 目录 1、为什么要有动态内存管理&#xff1f; 2、malloc和free &#xff08;1&#xff09;malloc函数 &…