java高级——Exception异常类基本解读

java高级——Exception异常类基本解读

  • 前情提要
  • 文章介绍
  • 继承结构
  • 异常详解
    • 1. 异常的定义
    • 2. 异常的分类
    • 3.3 异常的处理机制
      • 3.3.1 try catch finally语句
      • 3.3.2 throw关键字
      • 3.3.3 throws关键字
    • 4. 浅谈如何有效的避免异常的发生
    • 5. 自定义异常
    • 6. 常见的RuntimeException
  • 总结

前情提要

   上一篇文章我们探索了Collection集合中的Set,相对来说比较轻松,因为底层是基于Map实现的,只要对Map足够了解,Set只需要简单看一下,还是建议大家看一下Map的底层源码,对之后更好的使用集合有很大帮助。

java高级——Collection集合之Map探索(包含红黑树,Map的底层实现原理及相关类如LinkedHashMap等多中介绍,满满的干货)

java高级——Collection集合之Set探索

文章介绍

   这一篇我们来讲一下java中的异常,虽然我们在开发中一直在使用和遇到过异常,但对异常并没有过真正的了解,到底异常分为哪几类有哪些异常我们需要注意怎么有效的避免异常?这一篇文章将带领大家解决这些问题。

继承结构

在这里插入图片描述

   单从继承结构来说很简单,Exception继承了Throwable,Throwable实现了Seriaizeble接口,而源码经过一段时间的查看,发现研究的意义不大,很多都是基于非常底层的知识,重要的还是怎么更好的使用和认识异常

异常详解

1. 异常的定义

   异常在我们普遍的认知就是错误,专业来说就是在程序中出现了不正常或不按预期执行而导致程序的中断,这种现象称之为异常

2. 异常的分类

在这里插入图片描述

   异常我们主要分为三大类:

  • 非受查异常(也叫非受控异常、一般异常):
       在java中这种异常我们习惯性称之为RuntimException运行时异常),这种异常在程序运行中出现,编译是正常通过的,一般我们只能在方法中用throws抛出异常或者使用try catch语句进行捕捉
  • 受查异常(也叫受控异常):
       在java中这种异常通常在编译中就发现了,如果不处理则无法编译通过,最常见的就是进行IO操作时必须进行异常处理,比如FileNotFoundException
  • 错误(Error):
       注意,这是异常的一种,而Error如果出现那就不得了啦,程序多半是崩了,需要进行重启,比较典型的就是OutOfMemoryError(内存不足)。

3.3 异常的处理机制

3.3.1 try catch finally语句

   开发中最常用的异常处理机制是try catch语句,之后在catch语句中进行发生异常后的一些操作,如下:
在这里插入图片描述

   这里我们需要注意以下几点:

  • 异常发生后,异常之后的代码不会执行
  • finally语句块中的代码一定会执行,一般用于关闭某些资源,如输入输出流;
  • catch语句中一般写的是发生异常后的一些操作,一般不建议在catch语句块中写return语句

在这里插入图片描述

   为什么不建议在catch中写return语句,上面给出了原因,当finally中也出现return后catch语句中的return是不会执行的,所以开发中大多数在catch都是当异常发生后做的一些赋值操作,让程序正常运行,给用户返回一个友好的提示。

3.3.2 throw关键字

   throw使用也是比较方便的,当我们想要在一种情况抛出异常,让程序直接结束并给前台一个错误提示,但又不想写return语句的时候,throw就派上用场了。新手可能在Service中想要返回一个错误提示,就必须给controller一个返回值返回到前台,其实有时候不需要那么麻烦。

在这里插入图片描述

   这是一种简单的方式,直接用throw抛出异常,让程序直接结束返回,但这实际上还是有返回值,只是相对方便一些,还有一种就是全局捕捉异常,当我们前台的Ajax请求或者axios请求发出后,后台统一对返回值进行处理,如果发生异常,直接将异常信息捕捉,丢给前台即可。

   全局捕捉异常是非常有必要的,代码统一管理,没有必要在每个controller中单独处理了,当然现在的前后端分离项目都有这种机制,一般我们是不需要操心的,只需要使用即可,如果想要详细了解,需要研究一下springboot或者springmvc了,这里不做赘述。

3.3.3 throws关键字

   throws一般是写在方法上的,用于统一处理方法中的异常,但是非必要不建议这么用,因为不好进行捕捉,虽然控制台能打印出来。

4. 浅谈如何有效的避免异常的发生

   在真实的业务场景中,我们习惯将异常分为阻断性异常非阻断性异常,阻断性异常就是你没有正确的处理异常,导致用户看到了一些奇奇怪怪的报错信息,比如用户页面提示了一堆后台的错误堆栈信息,或者直接导致页面奔溃,一般出现这种错误事儿就大了,是要挨骂的哦(别问,问就是挨过骂)。非阻断性异常一般就是虽然程序报错了,也没给用户返回正确的信息,但是你的页面正常,也给了错误提示,数据也进行了回滚,这种一般没有什么,改一改就好。

   开发中除了全局进行异常处理,我们在代码编写过程中也要注意,非常有效的手段就是使用工具类NullException估计是一大噩梦,在判空时尽量使用StringUtils工具类或者ObjectUtils工具类,这些一般的第三方jar包都有,比如huttol工具包,还有各种工具类,这样能大大避免我们的错误。最重要的还是,不要完全相信自己的代码,比如我用UUID在数据库中查询一个pojo,这一定会有值,错了,年轻了,虽然这个UUID一定会对应到这条数据,但有可能数据库出问题了呢?有可能多线程操作导致数据被删除了呢?所以,一定要进行判空,这是兵家大忌

5. 自定义异常

   这里简单说一下自定义异常,只是给大家留个书面印象,自定义异常也是优化我们开发的手段,比如你的后台模块较多,薪酬啊,绩效啊等,这时候自定义异常就显得尤为重要,我们可以给指定模块自定义一个异常,这个模块统一使用这个异常,在后面排查的时候是比较有用的。

   一般大的系统都会有一个后台管理,而这个管理就有程序报错的统计,我们的系统对这一块有比较好的管理,如果程序出错,后台会进行捕捉,入库,管理员能在页面进行错误信息查看,有错误的堆栈信息,哪一个模块发生的错误,对应的账号是哪个,排查起来很方便。

   这一篇文章只是简单说一下,之后说到框架的时候会详细进行说明。

6. 常见的RuntimeException

  • NullPointerException:尝试访问或操作 null 对象时抛出。
  • ArrayIndexOutOfBoundsException:尝试访问数组的非法索引时抛出。
  • IllegalArgumentException:方法被传递了不合法或不适当的参数时抛出。
  • IOException:在进行 I/O 操作时可能抛出的各种异常的超类。
  • SQLException:在进行数据库操作时可能抛出的异常。
  • NumberFormatException :类型转换异常。

总结

   好了,这篇文章到这里就告一段落,后面在框架的解析中会将其再次带出,下一篇我们将解析IO流。

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

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

相关文章

JDBC(Java访问数据库)

Java Database Connectivity:Java访问数据库的解决方案 JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数…

HDU1056——HangOver,HDU1057——A New Growth Industry,HDU1058——Humble Numbers

目录 HDU1056——HangOver 题目描述 运行代码 代码思路 HDU1057——A New Growth Industry 题目描述 运行代码 代码思路 HDU1058——Humble Numbers 题目描述 运行代码 代码思路 HDU1056——HangOver 题目描述 Problem - 1056 运行代码 #include <iostream&…

拉提查合创5步玩转git工具协作代码开发

1 工具使用场景 开发团队使用git版本管理工具&#xff0c;进行协作代码开发过程中&#xff0c;最常用的场景为&#xff1a; &#xff08;1&#xff09;拉取代码 将git远端仓库最新代码拉取到本地。 &#xff08;2&#xff09;提交代码 将本地新增修改的代码提交至git远端仓库中…

【SpringBoot】2 项目搭建

创建项目 1&#xff09;确实本地 jdk 版本 打开命令行窗口&#xff1a;快捷键 Windows R&#xff0c;输入 CMD&#xff0c;敲回车 执行命令&#xff1a;java -version 2&#xff09;在项目 clone 的位置创建 Spring Boot 项目&#xff0c;使用 Maven 进行依赖管理&#xff…

大模型学习(1)

初学者&#xff0c;仅做自己学习记录&#xff0c;如果对你有什么帮助&#xff0c;那更好了。 下面是论文《Attention Is All You Need》的经典transformer架构&#xff0c;在学习的过程中&#xff0c;有很多疑惑。 embedding层在做什么 Transformer的embedding层在做的是将输…

35.【C语言】详解函数递归

目录&#xff1a; 定义 作用 例子1~3 拓展学习 趣味练习 1.定义&#xff1a;函数自己调用自己&#xff08;递推回归&#xff09; int main() {main()return 0; } 这样容易死循环&#xff0c;导致爆栈(Stack Overflow) 所以需要设立限制条件&#xff0c;使执行时越来越接近条…

02 Golang面向对象编程_20240727 课程笔记

视频课程 最近发现越来越多的公司在用Golang了&#xff0c;所以精心整理了一套视频教程给大家&#xff0c;这个是其中的第二部&#xff0c;后续还会有很多。 视频已经录制完成&#xff0c;完整目录截图如下&#xff1a; 课程目录 01 结构体的声明.mp402 使用var根据结构体…

iOS基础---多线程:GCD、NSThread、NSOperation

系列文章目录 iOS基础—多线程&#xff1a;GCD、NSThread、NSOperation 文章目录 系列文章目录一、GCD1.GCD的任务、函数、队列a.任务b.函数c.队列 2.GCD的使用a.同步函数并发队列b.异步函数并发队列c.同步函数串行队列d.异步函数串行队列e.同步函数主队列f.异步函数主队列 3.…

FastAPI(七十五)实战开发《在线课程学习系统》接口开发-- 创建课程

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 上次我们分享了&#xff0c;FastAPI&#xff08;七十四&#xff09;实战开发《在线课程学习系统》接口开发-- 删除留言 从本篇文章开始&#xff0c;…

如何学习Doris:糙快猛的大数据之路(从入门到专家)

引言:大数据世界的新玩家 还记得我第一次听说"Doris"这个名字时的情景吗?那是在一个炎热的夏日午后,我正在办公室里为接下来的大数据项目发愁。作为一个刚刚跨行到大数据领域的新手,我感觉自己就像是被丢进了深海的小鱼—周围全是陌生的概念和技术。 就在这时,我的…

嵌入式Python、ROS、SLAM、WebSocket和Node.js:智能巡逻监控安防机器人设计流程(代码示例)

项目概述 随着智能技术的发展&#xff0c;智能巡逻机器人在安防、监控和巡逻等领域的应用越来越广泛。本文将介绍一个结合嵌入式系统、机器人技术和后端开发的智能巡逻机器人。该机器人能够自主导航&#xff0c;实时检测异常情况&#xff08;如火灾或入侵者&#xff09;&#…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十七章 Linux中断实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

AI绘画:艺术与科技融合的新篇章

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;正逐步改变着传统艺术创作的格局。从早期的简单模仿到如今的个性化创作&#xff0c;AI绘画不仅提升了艺术创作的效率和质量&#xff0c;还开辟了全新的应用场景和商…

C++模板——泛型编程

目录 1. 什么是泛型编程 2. 函数模板 2.1 定义格式 2.2 实例化及原理 2.3 参数匹配原则 3. 类模板 3.1 定义格式 3.2 实例化 4. 非类型模板参数 5. 模板的特化 5.1 概念 5.2 函数模板和类模板特化 6. 模板的分离编译 1. 什么是泛型编程 如何实现一个通用的加…

【Java算法专场】二分查找(下)

目录 山脉数组的峰顶索引 算法分析 算法步骤 算法代码 算法示例 寻找峰值 算法分析 算法步骤 算法代码 算法示例 寻找旋转排序数组中的最小值 算法分析 算法步骤 算法代码 算法示例 点名 算法分析 算法步骤 算法代码 算法示例 山脉数组的峰顶索引 …

TCP/IP协议(全的一b)应用层,数据链层,传输层,网络层,以及面试题

目录 TCP/IP协议介绍 协议是什么,有什么作用? 网络协议为什么要分层 TCP/IP五层网络协议每层的作用 应⽤层 DNS的作用及原理 DNS工作流程 数据链路层 以太⽹帧格式 MAC地址的作用 ARP协议的作⽤ ARP协议的工作流程 MTU以及MTU对 IP / UD / TCP 协议的影响 传输层…

数据结构之判断二叉树是否为搜索树(C/C++实现)

文章目录 判断二叉树是否为搜索树方法一&#xff1a;递归法方法二&#xff1a;中序遍历法总结 二叉树是一种非常常见的数据结构&#xff0c;它在计算机科学中有着广泛的应用。二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是二叉树的一种特殊形式&…

自动化测试--WebDriver API

1. 元素定位方法 通过 ID 定位&#xff1a;如果元素具有唯一的 ID 属性&#xff0c;可以使用 findElement(By.id("elementId")) 方法来定位元素。通过 Name 定位&#xff1a;使用 findElement(By.name("elementName")) 来查找具有指定名称的元素。通过 Cl…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 5键键盘(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

Linux常用操作

软件安装 CentOS 系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y &#xff0c;自动确认 Ubuntu 系统使用 apt [install remove search] [-y] 软件名称 install 安装 remove 卸载 search 搜索 -y…