滚雪球学Java(39):学会Java异常处理,让你的程序健壮无比

news2024/11/27 0:28:55

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!


前言

  Java异常处理是编写高质量,健壮的代码的必备技能之一。异常是指程序在执行过程中遇到的错误情况,如除零错误、空指针异常、类型转换异常等,这些都可能导致程序运行出现错误,而异常处理就是为了应对这些错误情况。

  在本篇文章中,我们将学习Java异常处理的基本概念、语法和实践技巧,帮助您编写更可靠的Java程序。

摘要

本文将讨论以下主题:

  • 异常处理的基本概念
  • Java异常处理语法
  • 实现和抛出自定义异常
  • 异常处理的最佳实践

正文

异常处理的基本概念

  异常处理是编写高质量、健壮Java代码的重要组成部分。异常是指程序运行过程中出现的错误情况,包括编译时异常和运行时异常两种类型。

  编译时异常是指可以在编译时检查出的,例如文件未找到、类未定义等,这些异常必须在代码实现阶段捕获和处理。运行时异常是指无法在编译时检查出来的异常,例如空指针引用、除零错误等,这些异常可以通过合理的程序设计和测试来避免,在实现阶段处理也是可以的。

  Java异常处理机制是通过try-catch-finally语句块来实现的。一个try块包含了可能抛出异常的代码语句,在其中使用catch块来处理抛出的异常,在finally块中编写需要执行的代码,无论是否抛出异常都会执行。

  Java的异常处理机制可以让程序员在程序执行时更灵活地对异常情况进行处理,提高程序的健壮性和鲁棒性。

Java异常处理语法

Java异常处理语法主要包括try-catch和finally两个关键字。

try-catch语句块

  try-catch语句块用于捕获和处理异常情况。其中,try块中包含可能抛出异常的语句,而catch块用于捕获和处理异常。如果try块中的语句抛出异常,那么程序会跳转到catch块中执行,如果没有抛出异常则不执行。catch块可以处理指定类型的异常或所有类型的异常。

下面是一个简单的try-catch语句块的示例:

try {
    // 可能抛出异常的语句
} catch (ExceptionType e) {
    // 处理异常情况
}

  在上面的示例中,ExceptionType是指异常类型,如果try块中的代码抛出了该异常类型,则会跳转到catch块中执行,并传递异常对象e作为参数。

  如果需要捕获多种类型的异常,可以使用多个catch块,每个catch块捕获一种异常类型。也可以使用一个catch块来捕获所有类型的异常,如下所示:

try {
    // 可能抛出异常的语句
} catch (ExceptionType1 e1) {
    // 处理异常情况1
} catch (ExceptionType2 e2) {
    // 处理异常情况2
} catch (Exception e) {
    // 处理所有异常情况
}

  在上面的示例中,第一个和第二个catch块分别用于捕获不同类型的异常,而第三个catch块则用于捕获所有其他类型的异常。

finally语句块

  finally语句块用于编写在无论是否抛出异常都需要执行的代码。例如,关闭文件、释放资源等操作。finally语句块可以嵌套在try-catch语句块中,也可以单独使用。

下面是一个finally语句块的示例:

try {
    // 可能抛出异常的语句
} catch (ExceptionType e) {
    // 处理异常情况
} finally {
    // 无论是否抛出异常都会执行的语句
}

在上面的示例中,finally块中的语句无论try块中的代码是否抛出异常都会执行。

实现和抛出自定义异常

  Java允许程序员自定义异常类型,以满足特定的业务需求。可以通过继承Exception类或RuntimeException类来定义自己的异常类型。

  自定义异常必须继承Exception类或其子类,并实现父类中的构造函数。异常类通常具有两个构造函数,一个是无参构造函数,另一个是带有字符串信息的有参构造函数。

下面是一个自定义异常类的示例:

public class MyException extends Exception {
    public MyException() {}

    public MyException(String message) {
        super(message);
    }
}

  在上面的示例中,MyException类继承了Exception类,并实现了父类中的两个构造函数。

  当需要抛出自定义异常时,可以使用throw关键字将异常对象抛出。抛出自定义异常的语法与抛出内置异常相同,只需要将自定义异常类型传递给throw关键字即可。

下面是一个抛出自定义异常的示例:

public void myMethod() throws MyException {
    // 抛出自定义异常
    throw new MyException("自定义异常发生了!");
}

  在上面的示例中,myMethod()方法抛出了一个自定义异常对象。在调用该方法时,必须使用try-catch语句块处理该异常,或者使用throws关键字将该异常抛给上层方法处理。

异常处理的最佳实践

以下是Java异常处理的最佳实践:

  1. 不要忽略异常,即使你认为它不会发生。异常处理是编写健壮Java代码的关键组成部分,需要对可能出现的异常进行预判和处理。

  2. 尽量不要在finally块中使用return语句,因为finally块中的语句无论是否抛出异常都会执行,可能会覆盖try块中的返回值。

  3. 对于需要关闭文件、释放资源等操作,应该在finally块中进行,以确保在程序发生错误或异常时也能正确处理。

  4. 使用try-with-resources语句,可以简化对资源的关闭操作,同时避免因忘记关闭资源而导致的问题。

  5. 使用自定义异常可以提高代码的可读性和可维护性,但是不要过度使用。只有在需要按照特定业务逻辑处理异常时才需要自定义异常。

小结

  Java异常处理是编写高质量、健壮Java代码的重要组成部分。在本篇文章中,我们学习了异常处理的基本概念、Java异常处理语法、自定义异常的实现和抛出,以及异常处理的最佳实践。异常处理是编写高质量Java代码不可或缺的一部分,需要仔细学习和实践。

参考资料

  • Java异常处理-菜鸟教程
  • Java异常处理机制详解-阮一峰的网络日志
  • Effective Java第二版,第9条:对于可以恢复的情况使用受检异常,对于编程错误使用运行时异常
  • 深入理解Java虚拟机,第10章:异常处理

附录源码

  如上涉及所有源码均已上传同步在 Gitee,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

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

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

相关文章

机器视觉-标定篇

3D结构光标定 结构光视觉的优点: 非接触、信息量大、测精度高、抗干扰能力强。 结构光视觉传感器参数的标定包括:摄像机参数标定、结构光平面参数标定。 结构光视觉测量原理图 我们不考虑镜头的畸变,将相机的成像模型简化为小孔成像模型…

html中图片、音乐、视频标签及选择器、背景

目录 图片 音乐 视频 子代选择器 交集选择器 背景 文章主要补充之前html文章一些漏洞&#xff1a;HTML常用标签表格表单_小俱的一步步的博客-CSDN博客 在VScode中新创建html文件&#xff0c;&#xff01;“Tab”键&#xff0c;自动生成html骨架 图片 <img src"…

Android T 禁止应用添加窗口的操作

序 什么情况下会出现我们需要禁止应用添加窗口的情况呢&#xff1f; 假如有一个应用的窗口&#xff0c;我们点开后是透明的或者会影响到系统的使用&#xff0c;那么我们就有必要对这个窗口操作一下 回顾我们在Android T WMS窗口相关流程中所讲的内容 禁止应用添加窗口的操作…

leetcode题目分析(一)leetcode155最小栈

一、前言 本题基于leetcode155最小栈这道题&#xff0c;说一下通过java解决的一些方法。 需要尤其注意的是&#xff0c;此题输入的值的区间范围在-2^31 < val < 2^31 - 1.这将会影响我们最后一种最优解的结果出现问题。这些都是后话。 二、解决思路 其实在一开始的提交…

vue-cli vue3

安装 cli npm i -g vue/cli4.5.13查看版本&#xff1a;vue -V升级版本&#xff1a;npm update -g vue/cli 升级 在 v 3.0.0 版本中是不支持的最新的 script setup 语法执行指令升级&#xff1a; npm i vue3.2.8 vue-router4.0.11 vuex4.0.2 "vue": "^3.2.8&q…

方案:AI赋能,森林防火可视化智能监管与风险预警系统解决方案

一、方案背景 森林火灾是世界八大自然灾害之一&#xff0c;具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点&#xff0c;严重危及人民生命财产和森林资源安全&#xff0c;甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态…

SOLIDWORKS三维剖视图怎么做

1.SOLIDWORKS一般剖视图制作方法&#xff0c; a.先选择剖面视图命令制作&#xff08;常用&#xff09; b.先绘制剖切线制作剖视图&#xff0c;绘制剖切线—选择剖面视图命令 2.SOLIDWORKS剖面线的调整。当对默认剖面线不满意时&#xff0c;可以双击剖面线对剖面线进行调整调整 …

Qt重写QTreeWidget实现拖拽

介绍 此文章记录QTreeWidget的重写进度&#xff0c;暂时停滞使用&#xff0c;重写了QTreeWidget的拖拽功能&#xff0c;和绘制功能&#xff0c;自定义了数据结构&#xff0c;增加复制&#xff0c;粘贴&#xff0c;删除&#xff0c;准备实现动态刷新数据支持千万数据动态刷新&a…

Postman应用——Pre-request Script和Test Script脚本介绍

文章目录 Pre-request Script所在位置CollectionFolderRequest Test Script所在位置CollectionFolderRequest Pre-request Script&#xff08;前置脚本&#xff09;&#xff1a;可以使用在Collection、Folder和Request中&#xff0c;并在Request请求之前执行&#xff0c;可用于…

整站抓取的神器

整站抓取的神器 TeleportUltraWebZipMihov Picture DownloaderWinHTTrack HTTrackMaxprogWebDumper 五款整站抓取的工具 TeleportUltra Teleport Ultra所能做的&#xff0c;不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能)&#xff0c;它可…

链表oj题2(Leetcode)(牛客)——合并两个有序链表;判断回文链表;链表分割

链表oj题2&#xff08;Leetcode&#xff09;&#xff08;牛客&#xff09; 一&#xff0c;合并两个有序链表1.1分析2.2代码 二&#xff0c;链表的回文结构2.1分析2.2代码 三&#xff0c;链表分割3.1分析3.2代码 四&#xff0c;小结 一&#xff0c;合并两个有序链表 合并两个有…

vue的工程化开发全流程,以及开发中的细节语法和用法

vue的工程化开发全流程 文章目录 vue的工程化开发全流程1、工程化开发&脚手架Vue CLI1.1、前言1.2、脚手架Vue CLI1.3、脚手架目录文件介绍&项目运行流程1.4、组件化开发&根组件1.5、普通组件的注册使用 2、工程化开发细则2.1、组件的三大组成部分2.2、组件的样式冲…

yolov8在设置amp=False 之后map 训练依旧为0 解决办法

可能原因 是cuda 版本导致的半精度浮点数计算出现nan的bug 解决办法 设置ampFalse 就是不使用混合精度训练。或者直接改用低版本的cuda和pytorch。cuda11.6 以下 直接有效也有可能是学习率过高 降低学习率 设置ampFalse之后还是存在问题 是因为yolov8库的问题 按以下修改 找到…

RKDevTool打包成update.img

(1) 准备好RKDevTool_Release和rockdev目录相关的文件工具 (2) 在rockdev建立image目录 (3) 往image填入和package-file有关的img文件 (4) 运行需要的xxx_mkupdate文件,直到生成想要的update.img (5) 导入烧录工具,文件大,需要等待一段时间,进入MASKROM模式,点击烧录upd…

我只是个小市民——经受不住宏大叙事

我只是个小市民 ——经受不住宏大叙事 作日看到一个曾经的朋友在朋友圈晒出了在某地旅游的照片&#xff0c;照片清新动人&#xff0c;狠狠地打入了我的内心&#xff0c;我知道光靠手机是拍不出来这样唯美的画面的&#xff0c;于是我问她是如何弄出这么好看的照片&#xff0c;…

淘宝商品sku数据接口监控

淘宝商品sku数据接口监控是指通过API接口对淘宝店铺的商品库存、价格、销售量等数据进行实时监控&#xff0c;以便商家能够及时调整销售策略、优化库存、了解竞争对手的动态等。 监控的具体功能包括&#xff1a; 实时监控商品库存和价格变化&#xff0c;及时调整自己的销售策…

数据结构前瞻

集合框架 JAVA的集合框架是定义在java.util包下的一组接口和实现类&#xff0c;用于将多个元素置于一个单元中&#xff0c;对这些元素进行快速&#xff0c;便捷的存储&#xff0c;减速和管理&#xff0c;即增删查改 下面的格子&#xff0c;黄色代表接口&#xff0c;蓝色代表抽…

监控办公室电脑用什么软件?

监控办公室员工电脑的工作情况是一项非常重要的管理任务&#xff0c;它可以帮助企业管理者及时发现员工的问题、提高工作效率和保障企业安全。以下是一些具体的方法和步骤&#xff0c;供您参考&#xff1a; 1、安装监控软件 在监控员工电脑之前&#xff0c;您需要先安装一款专…

Redis核心数据结构实战与高性能解析

目录 一、安装Redis 二、Redis线程与高性能 2.1 Redis是单线程么&#xff1f; 2.2 Redis读写是单线程为何这么快&#xff1f; 2.3 Redis如何处理并发操作命令&#xff1f; 三、核心数据结构实战 3.1 字符串常用操作实战 SET 存入键值对 SETNX SETEX MSET 批量存入键…

vue3中两个el-select下拉框选项相互影响

vue3中两个el-select下拉框选项相互影响 1、开发需求2、代码2.1 定义hooks文件2.2 在组件中使用 1、开发需求 如图所示&#xff0c;在项目开发过程中&#xff0c;遇到这样一个需求&#xff0c;常规时段中选中的月份在高峰时段中是禁止选择的状态&#xff0c;反之亦然。 2、代…