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://xiahunao.cn/news/3268842.html

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

相关文章

我为何撰写有关人工智能和数据科学的文章

撰写人工智能文章的 6 大好处 「AI秘籍」系列课程: 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识AI 进阶:企业项目实战 可直接在橱窗里购买,或者到文末领取优惠后购买: 自…

C++ //练习 15.30 编写你自己的Basket类,用它计算上一个练习中交易记录的总价格。

C Primer(第5版) 练习 15.30 练习 15.30 编写你自己的Basket类,用它计算上一个练习中交易记录的总价格。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块: /********************…

数据结构 - 红黑树

文章目录 前言一、红黑树介绍1、红黑树的概念2、红黑树的性质 二、实现红黑树1、基本框架2、插入3、删除4、查找5、测试红黑树6、红黑树代码 三、红黑树性能四、AVL树和红黑树的差别 前言 红黑树是一种二叉搜索树,所以学习前需要学会基本的二叉搜索树,并…

X-AnyLabeling标注软件使用方法

第一步 下载 官方X-AnyLabeling下载地址 github:X-AnyLabeling 第二步 配置环境 使用conda创建新的虚拟环境 conda create -n xanylabel python3.8进入环境 conda activate xanylabel进入X-AnyLabeling文件夹内,运行下面内容 依赖文件系统环境运行环…

昇思MindSpore 应用学习-CycleGAN图像风格迁移互换

日期 心得 昇思MindSpore 应用学习-CycleGAN图像风格迁移互换(AI代码学习) CycleGAN图像风格迁移互换 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络,来自论文 Unpaired Image-to-Image Trans…

数据中台 | 3分钟带你读懂数据中台的由来

1.数据中台产生的原因 数据中台的概念起源于中国阿里巴巴集团提出的“大中台,小前台”战略。这一理念的核心在于通过构建强大的中台体系,为前端的快速创新和个性化业务需求提供强有力的支持。具体到数据中台,其设计初衷是为了应对企业内部数…

如何解决Windows系统目录权限问题

目录 前言1. 为什么会出现权限问题2. 修改文件权限的步骤2.1 确定目标文件2.2 右键属性设置2.3 更改所有者2.4 修改权限2.5 确认修改 3. 替换文件3.1 拷贝新的文件3.2 验证替换结果 结语 前言 在Windows系统中,时常需要往C盘系统目录下拷贝或者替换文件。然而&…

Java面试还看传统八股文?快来看看这个场景题合集吧【附PDF】

以下就是这份面试场景文档↓ 这里有什么? ↓↓ 1.针对 2024 年面试行情的变化设计的面试场景题以及回答思路 2. 如何快速通过面试的详细攻略 3. 简历优化技巧 1.知己知彼才能百战百胜,如何做好面试前的准备工作 场景题答案以及更多场景题八股文一线大…

Spring Security学习笔记(二)Spring Security认证和鉴权

前言:本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 上一篇博客介绍了Spring Security的整体架构,本篇博客要讲的是Spring Security的认证和鉴权两个重要的机制。 UsernamePasswordAuthenticationFilter和BasicAuthenticationFilter是…

docker 安装单机版redis

把这三个放上去 修改成自己的 按照自己需求来 照图片做 vim redis.conf vim startRedis.sh mv startRedis.sh deployRedis.sh sh deployRedis.sh docker run --privilegedtrue \ --name dev.redis --restartalways \ --network dev-net \ -v ./config/redis.conf:/etc/r…

编译原理期末复习-按考点

编译原理期末复习-按考点 Ocean University of China 第一章 引论 翻译器、编译器、解释器 翻译器:把一种语言变成另外一种语言(语义等价) 编译器:翻译器的一种 解释器:不产生目标代码,解释执行源程序&a…

24年第三届钉钉杯大学生大数据挑战赛浅析

需要完整资料,请关注WX:“小何数模”! 本次钉钉杯大数据挑战赛的赛题已正式出炉,无论是赛题难度还是认可度,该比赛都是仅次于数模国赛的独一档,可以用于国赛前的练手训练。考虑到大家解题实属不易&#xf…

CentOS 7.x 的 YUM 仓库问题

背景 CentOS Linux 7 的生命周期(EOL)已经于 2024 年 6 月 30 日终止这意味着 CentOS 7.x 的官方镜像站点将不再提供服务,导致在使用 yum 安装或更新程序时可能会遇到 错误。本文将介绍如何解决这一问题,使得你可以继续在 CentOS…

17 敏捷开发—Scrum(2)

从上一篇 「16 敏捷开发实践(1)」中了解了Scrum是一个用于开发和维护复杂产品的框架,是一个增量的、迭代的开发过程。一般由多个Sprint(迭代冲刺)组成,每个Sprint长度一般为2-4周。下面全面介绍Scrumde 角色…

[Windows CMD] 查看网络配置 ipconfig

ipconfig 是一个网络命令工具,用于显示所有适配器(网络接口)的 IPv4 和 IPv6 配置信息。这个命令在 Windows 操作系统中非常常用,也存在于其他一些基于 IP 的网络系统中,如 macOS 和 Linux(在这些系统中通常…

Android中广播接收器BroadcastReceiver学习

目录 一 前言二 分类2.1 标准广播2.1.1 动态注册2.1.2 静态注册2.1.3 带权限的标准广播 2.2 有序广播2.3 系统广播 一 前言 BroadcastReceiver是四大组件之一,用于组件间通信,底层是binder机制。注:(贴的代码是Compose写的且不规…

unity2D游戏开发07整合游戏

角色类 设置角色类,在Scripts下新建MonoBehaviours文件夹,并将MovementController拖进去 在MonoBehaviours新建c#脚本,命名为Character,双击打开编辑 编写代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public abstract class Ch…

【QT】QT 窗口(菜单栏、工具栏、状态栏、浮动窗口、对话框)

Qt 窗口是通过 QMainWindow类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏(Menu Bar)、多个工具栏(Tool Bars)、…

2024最新Selenium面试题(附带答案),建议收藏备用

一.你在TestNG中使用了哪些注解? TestBeforeSuiteAfterSuiteBeforeTestAfterTestBeforeClassAfterClassBeforeMethodAfterMethod 二.如何从Excel中读取数据? FileInputStream fs new FileInputStream(“excel文件路径”); Workbook wb WorkbookFact…

LLM模型之基于MindSpore通过GPT实现情感分类

前言 # 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行!pip install mindnlp0.3.1 !pip install mindnlp !pip install jieba %env HF_ENDPOINThttps://hf-mirror.com 导入对应的包 import osimport m…