JAVA基础 - 异常处理

目录

一. 简介

二. 受检异常

三. 非受检异常

四. 自定义异常类



一. 简介

异常处理是 Java 编程中的一个重要概念,它用于处理程序运行时可能出现的不正常情况。

在 Java 中,异常可以分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。

受检异常是指在编译阶段必须被处理的异常,比如 FileNotFoundException 。如果在代码中可能抛出这种异常,就必须使用 try-catch 语句或者在方法声明中使用 throws 关键字来告知调用者可能会抛出这个异常。

非受检异常通常是指运行时异常,比如 NullPointerException 、ArrayIndexOutOfBoundsException 等。虽然不强制要求处理,但为了使程序更健壮,也应该进行适当的处理。

二. 受检异常

Java 中的受检异常(Checked Exception)

受检异常是在编译时需要被处理的异常。这意味着如果在代码中可能抛出受检异常,那么必须在代码中显式地处理它,要么使用 try-catch 语句捕获并处理异常,要么在方法声明中使用 throws 关键字声明该方法可能抛出的受检异常,以便告知调用者需要处理这些异常。

常见的受检异常包括:

  1. IOException:用于处理输入输出相关的异常,如文件读写异常。
  2. SQLException:与数据库操作相关的异常。

受检异常的特点和作用:

  1. 提高代码的健壮性:强制开发者在编写代码时考虑并处理可能出现的异常情况,从而减少程序在运行时因未处理异常而崩溃的可能性。

  2. 增强代码的可维护性:通过明确声明可能抛出的异常,其他开发者在调用该方法时能够清楚地知道需要处理哪些异常情况,便于代码的理解和维护。

处理受检异常的方式:

  1. 使用 try-catch 语句捕获并处理异常:
try {// 可能抛出受检异常的代码
} catch (ExceptionType1 e1) {// 处理 ExceptionType1 异常的代码
} catch (ExceptionType2 e2) {// 处理 ExceptionType2 异常的代码
}
  1. 在方法声明中使用 throws 关键字声明可能抛出的异常:
public void method() throws IOException {// 可能抛出 IOException 的代码
}

举例说明:

假设我们有一个读取文件内容的方法:

import java.io.FileReader;
import java.io.IOException;public class FileReaderExample {public static String readFileContent(String filePath) throws IOException {FileReader reader = new FileReader(filePath);StringBuilder content = new StringBuilder();int c;while ((c = reader.read())!= -1) {content.append((char) c);}reader.close();return content.toString();}public static void main(String[] args) {try {String content = readFileContent("nonexistent.txt");System.out.println(content);} catch (IOException e) {System.out.println("捕获到文件读取异常: " + e.getMessage());}}
}

在上述示例中,readFileContent 方法可能抛出 IOException ,在 main 方法中通过 try-catch 处理了这个异常。

三. 非受检异常

Java 中的非受检异常(Unchecked Exception)

非受检异常也被称为运行时异常,是在程序运行时可能发生并且不需要在编译阶段强制处理的异常。这类异常通常是由于程序的逻辑错误或不可预见的运行时状况导致的。

常见的非受检异常包括:

  1. NullPointerException:当尝试对一个为 null 的对象引用进行操作时抛出。
  2. ArrayIndexOutOfBoundsException:数组下标越界时抛出。
  3. ArithmeticException:例如除数为 0 的算术运算时抛出。

非受检异常的特点和作用:

  1. 反映程序的逻辑错误:非受检异常的出现往往暗示着代码中存在潜在的逻辑问题,需要开发者进行修正和优化。

  2. 提高程序的运行效率:由于不需要在编译阶段强制处理,减少了代码的冗余性,使代码更简洁。

处理非受检异常的方式:

虽然不强制要求捕获处理,但为了使程序更健壮和可靠,也可以选择使用 try-catch 语句来捕获和处理非受检异常。

举例说明:

public class UncheckedExceptionExample {public static void main(String[] args) {int[] arr = new int[5];// 以下会抛出 ArrayIndexOutOfBoundsException 异常try {System.out.println(arr[10]);} catch (ArrayIndexOutOfBoundsException e) {System.out.println("数组下标越界异常: " + e.getMessage());}Object obj = null;// 以下会抛出 NullPointerException 异常try {obj.toString();} catch (NullPointerException e) {System.out.println("空指针异常: " + e.getMessage());}}
}

在上述示例中,演示了可能出现的数组下标越界和空指针的非受检异常,并通过 try-catch 进行了捕获处理。

四. 自定义异常类

在 Java 中,我们可以创建自己的异常类来满足特定的需求。自定义异常类可以使代码更具可读性和可维护性,能够更准确地描述程序中出现的异常情况。

创建自定义异常类通常需要以下步骤:

  1. 继承 Exception 类或其子类:如果自定义的异常是受检异常,通常继承 Exception 类;如果是运行时异常,通常继承 RuntimeException 类。
public class CustomCheckedException extends Exception {public CustomCheckedException(String message) {super(message);}
}public class CustomRuntimeException extends RuntimeException {public CustomRuntimeException(String message) {super(message);}
}
  1. 提供构造函数:至少提供一个接受字符串消息作为参数的构造函数,用于传递异常的详细信息。

在使用自定义异常时,可以像使用系统提供的异常一样,通过 throw 关键字抛出异常,并在适当的地方进行捕获处理。

举例说明:

假设我们正在开发一个图书馆管理系统,当用户借阅的图书数量超过规定数量时,抛出一个自定义的受检异常。

public class Library {private static final int MAX_BOOKS_TO_BORROW = 5;public void borrowBooks(int numBooks) throws CustomCheckedException {if (numBooks > MAX_BOOKS_TO_BORROW) {throw new CustomCheckedException("借阅的图书数量超过了限制");}// 执行借阅操作}public static void main(String[] args) {Library library = new Library();try {library.borrowBooks(8);} catch (CustomCheckedException e) {System.out.println(e.getMessage());}}
}

又比如,在一个电商系统中,当用户输入的优惠码无效时,抛出一个自定义的运行时异常。

public class Ecommerce {public void applyDiscountCode(String code) {if (!isValidCode(code)) {throw new CustomRuntimeException("无效的优惠码");}// 应用优惠码的逻辑}private boolean isValidCode(String code) {// 验证优惠码的逻辑return false;}public static void main(String[] args) {Ecommerce ecommerce = new Ecommerce();try {ecommerce.applyDiscountCode("INVALID_CODE");} catch (CustomRuntimeException e) {System.out.println(e.getMessage());}}
}

通过自定义异常类,可以更清晰地表达程序中特定的错误情况,方便开发人员进行错误处理和调试。

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

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

相关文章

一篇长文搭建AI大模型应用平台架构

在研究了6家知名公司如何部署生成式AI应用程序后,注意到它们的平台有很多相似之处。概述了生成式AI大模型应用平台的常见组件、它们的作用以及它们的实现方式。尽力保持架构的通用性,但某些应用程序可能会有所不同。 Generative AI大模型应用平台整体架…

【Vulnhub系列】Vulnhub_pipe 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub-pipe 靶场渗透 原文转载已经过授权 原文链接:Lusen的小窝 - 学无止尽,不进则退 (lusensec.github.io) 一、环境配置 1、解决IP扫描不到问题 2、打开虚拟机,并修改网络连接模式为【NAT】即可 二、信息收集 1…

树状机器学习模型综述(含python代码)

树状机器学习模型综述 树状模型是机器学习中一种非常重要的算法类别,因其直观的结构和良好的可解释性而广泛应用于分类和回归任务。本文将综述几种常见的树状模型,包括决策树、随机森林、LightGBM、XGBoost和CatBoost,讨论它们的原理、用途以…

自适应降噪与沉浸音效的结合,戴上QCY MeloBuds Pro,开启静谧音乐之旅

现在蓝牙耳机的选择真是太丰富了,其中性价比高的还是国产品牌,我之前用过几款QCY的耳机,感觉不管是设计,还是音质,以及佩戴的舒适度,都要比同价位的耳机更出色一些。最近我又新入手了一款 MeloBuds Pro&…

【QT 5-控件对比-小技巧-控件显示文字和更改文字-label控件-lineEdit控件-记录】

【QT 5-控件对比-小技巧-控件显示文字和更改文字-label控件-lineEdit控件-记录】 1、前言2、环境3、控件说明(1)QLabel(2)QLineEdit 4、控件代码说明(1)第一种控件 QLabel1-UI文件上编写2-代码控制3-完全代…

java实现加水印功能

1-Word加水印 实现原理&#xff1a; ● 通过页眉页脚生成文字水印或图片水印&#xff0c;然后设置页眉页脚的高度以及旋转角度来设置水印。 源代码&#xff1a; 1、引入pom依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml…

在linux编译JsonCpp 1.9.5

编译方法 mkdir jsoncpp-Sandbox ; cd jsoncpp-Sandbox git clone https://github.com/open-source-parsers/jsoncpp.git mkdir jsoncpp-build mkdir jsoncpp-install cd ./jsoncpp-build/ cmake ../jsoncpp/ -DCMAKE_INSTALL_PREFIX/home/vis/work/SourceCode/jsoncpp-Sandbo…

智能体一键生成个性化贺卡

文章目录 一、前言二、创建智能体编辑名称头像简介人物设定开场白引导示例高级配置调试发布 三、总结 一、前言 欢迎来到节日的温馨角落&#xff01;我是您的节日贺卡助手&#xff0c;专为您打造独一无二的节日祝福。无论是温馨的问候&#xff0c;还是创意的惊喜&#xff0c;我…

【Threejs进阶教程-着色器篇】5. 2D SDF(二)圆形波纹效果

2D SDF 圆形波纹效果 关于本Shader教程前四篇地址&#xff0c;请按顺序学习本博客使用模板代码中的Shader模板绘制第一圈波纹绘制多圈波纹fract函数 让光波动起来使用uniform控制最终效果追加uniform&#xff0c;以及lil.gui控制器修改片元着色器最终效果 完整源码 关于本Shad…

leetcode日记(63)颜色分类

感觉就是排序问题&#xff1f;我使用的是时间复杂度比较高的简单粗暴排序法&#xff0c;时间复杂度O&#xff08;n^2&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int nnums.size();for(int i0;i<n;i){for(int ji1;j<n;j){if…

鸿蒙应用框架开发【选择并查看文档与媒体文件】 本地数据与文件

选择并查看文档与媒体文件 介绍 应用使用ohos.file.picker、ohos.file.fs等接口&#xff0c;实现了picker拉起文档编辑保存、拉起系统相册图片查看、拉起视频并播放的功能。 效果预览 使用说明&#xff1a; 在首页&#xff0c;应用显示查看最近打开文件功能的跳转按钮&…

APP自动化测试 ------ 滑动和拖拽事件操作!

前言 Appium自动化测试中的常见模拟操作涵盖了多种用户交互行为&#xff0c;这些操作对于自动化测试框架来说至关重要&#xff0c;因为它们能够模拟真实用户的使用场景&#xff0c;从而验证应用程序的功能和稳定性。 今天讲解滑动和拖拽事件操作&#xff1a; 1、swipe滑动事…

java-数据结构与算法-02-数据结构-07-优先队列

1. 概念 队列是一种先进先出的结构&#xff0c;但是有些时候&#xff0c;要操作的数据带有优先级&#xff0c;一般出队时&#xff0c;优先级较高的元素先出队&#xff0c;这种数据结构就叫做优先级队列。 比如&#xff1a;你在打音游的时候&#xff0c;你的朋友给你打了个电话…

springboot短视频推荐系统-计算机毕业设计源码21503

摘 要 本论文基于协同过滤算法&#xff0c;旨在设计并实现一种基于SpringBoot框架的短视频推荐系统。该系统主要分为平台用户和管理员两类角色&#xff0c;用户可以注册、登录、浏览短视频内容&#xff0c;并根据个人兴趣收藏喜爱的视频。管理员则可以管理系统数据、用户和内容…

nginx反向代理和负载均衡+安装jdk-22.0.2

ps -aux|grep nginx //查看进程 nginx 代理 nginx代理是负载均衡的基础 主机&#xff1a;192.168.118.60 这台主机只发布了web服务&#xff0c;没有做代理的任何操作 修改一下index.html中的内容 echo "this is java web server" > /usr/local/nginx/htm…

JVM性能调优全指南:高流量电商系统的最佳实践

1.G1(Garbage-First) 官网: G1 Garbage Collection G1收集器是Java 7中引入的垃圾收集器,用于替代CMS(Concurrent Mark-Sweep)收集器。它主要针对大内存、多核CPU环境下的应用场景,具有以下特点: 分代收集:G1仍然保留了分代的概念,但新生代和老年代不再是物理隔离的,…

线程的同步互斥

互斥 互斥保证了在一个时间内只有一个线程访问一个资源。 先看一段代码&#xff1a;三个线程同时对全局变量val进行--&#xff0c;同时val每自减一次其线程局部存储的全局变量 #include <iostream> #include <thread> #include <vector> #include <uni…

Java之Java基础十六(反射)

一、什么是反射 一般情况下&#xff0c;我们在使用某个类之前已经确定它到底是个什么类了&#xff0c;拿到手就直接可以使用 new 关键字来调用构造方法进行初始化&#xff0c;之后使用这个类的对象来进行操作。 Writer writer new Writer(); writer.setName("aaa"…

WPF的MVVM架构:如何通过数据绑定简化UI逻辑

WPF的MVVM架构&#xff1a;如何通过数据绑定简化UI逻辑 目录 MVVM模式概述数据绑定在MVVM中的作用实现MVVM模式的步骤MVVM模式中的常见问题与解决方案实践示例总结 MVVM模式概述 MVVM&#xff08;Model-View-ViewModel&#xff09;是一种设计模式&#xff0c;用于WPF应用程序…

超声波传感器 - 从零开始认识各种传感器【第十九期】

超声波传感器|从零开始认识各种传感器 1、什么是超声波传感器 超声波传感器是一种利用超声波来进行距离测量和目标检测的传感器。它通过发送&#xff0c;超声波脉冲&#xff0c;并测量超声波从传感器发射到目标物体并返回的时间来计算目标物体与传感器之间的距离。 超声波传感…