Java的异常处理体系

目录

  • 异常处理
    • 1、Java的异常类层次结构
    • 2、try-catch-finally 使用注意事项
    • 3、在Web应用中如何实现全局异常处理机制

异常处理

1、Java的异常类层次结构

在这里插入图片描述
其中Error表示程序运行错误
常见的错误类型有:
OutOfMemoryError (内存溢出错误)
StackOverFlowError (栈内存溢出错误)
IOError (IO错误)

Exception表示程序本身可以处理的异常
其中Exception又分为
①、CheckedException (检查异常 必须在代码中显式处理 使用try catch捕获 或者 在方法上使用 throws 抛出 除了RuntimeException及其子类以外,其他的Exception类及其子类都属于受检查异常 )
常见的包括:
IO Exception
SQL Exception
FileNotFoundException
ClassNotFoundException

②、UncheckedException(非检查异常 不用显式捕获 或者 throws抛出 )
常见的包括:
NullPointerException(空指针异常)
ClassCastException (类型转换错误)
IndexOutOfBoundsException (数组下标越界)
ConcurrentModificationException(并发修改异常)
NumberFormatException(数字转换异常)
ArithmeticException(算数异常)
IllegalArgumentException(参数错误)
UnsupportedOperationException(不支持的操作 比如使用Arrays.asList生成的集合 无法使用增删改操作)

2、try-catch-finally 使用注意事项

  • ①、try块:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
  • ②、当在try 块 或 catch块遇到 return语句时 finally 块会在 方法返回之前执行
  • ③、不要在 finally 块中使用 return 语句 ,当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。
    示例:
public int foo() {try {// some code that may throw an exceptionreturn 1;} catch (Exception e) {// handle exceptionreturn 2;} finally {return 3;}
}

在这个例子中,无论 try 块中的代码是否抛出异常,finally 块中的 return 3; 语句都会执行,而且会覆盖 try 块和 catch 块中的 return 语句,导致 foo() 方法始终返回3;

  • ④、finally 块中的代码不一定会被执行 ,如果在try 或者 catch块中 出现了内存溢出或者jvm退出( System.exit(1);)等错误情况 ,对应finally 块中的代码就不会执行了。
  • ⑤、面对必须要关闭的资源,我们总是应该优先使用 try-with-resources 而不是try-finally
    try-with-resources 适用的资源包括 任何实现了 java.lang.AutoCloseable或者 java.io.Closeable 的对象
    比如:Java 中类似于InputStream、OutputStream这类IO资源 需要我们使用完毕后手动关闭资源的
//读取文本文件的内容  BufferedReader 需要在使用完毕后手动释放资源
public static void main(String[] args) {String fileName = "C:\\Users\\Administrator\\Desktop\\数据分片.txt";BufferedReader reader = null;try {reader = new BufferedReader(new FileReader(fileName))String line;while ((line = reader.readLine()) != null) {System.out.println(line); // 处理每一行的内容}} catch (IOException e) {e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}}//读取文本文件的内容  BufferedReader 在使用完毕后自动释放资源 (Java 7 之后支持try-with-resources )
public static void main(String[] args) {String fileName = "C:\\Users\\Administrator\\Desktop\\数据分片.txt";try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line); // 处理每一行的内容}} catch (IOException e) {e.printStackTrace();}}//读取文本文件的内容  如果有多个资源同时声明 可以使用分号分隔即可
public static void main(String[] args) {String fileName = "C:\\Users\\Administrator\\Desktop\\数据分片.txt";try (BufferedReader reader = new BufferedReader(new FileReader(fileName)); Scanner scanner = new Scanner(new File(fileName));) {String line;while ((line = reader.readLine()) != null) {System.out.println(line); // 处理每一行的内容}System.out.println("=====>>>>>>>>>>>>>>>>>>>>>>>>");while (scanner.hasNext()) {System.out.println(scanner.nextLine()); // 处理每一行的内容}} catch (IOException e) {e.printStackTrace();}}
  • ⑥、不要省略异常信息的记录 在catch块中 使用日志记录关键异常信息
    记录信息时尽量只写一个log.error或者log.info语句 , 因为在多线程环境下 两个相邻的日志语句不一定打印在相邻的位置
public void aa() {try {int a = 1/0;} catch (Exception e) {// 这里一定要记录完整的异常信息log.error("哦,错误竟然发生了: {}" , e);}
}

3、在Web应用中如何实现全局异常处理机制

主要利用 @ControllerAdvice或者@RestControllerAdvice注解
@ControllerAdvice:
@ControllerAdvice 注解用于定义全局控制器建议,在 Spring MVC 中,控制器建议由控制器中的 @ExceptionHandler 方法、@InitBinder 方法和 @ModelAttribute 方法组成。通过 @ControllerAdvice 注解的类,可以将这些方法集中到一个地方,以便对所有控制器进行统一的异常处理、数据绑定等操作。

@RestControllerAdvice:
@RestControllerAdvice 是 @ControllerAdvice 的一个变种,用于对以 REST 风格提供 API 服务的控制器进行全局建议定义。与 @ControllerAdvice 类似,@RestControllerAdvice 注解的类可以包含全局异常处理、全局数据绑定等方法,但它专门用于 RESTful 服务,可以将异常信息转化为 JSON 格式返回给客户端。
总的来说,@ControllerAdvice 用于传统的基于视图的控制器,而 @RestControllerAdvice 用于 RESTful 服务的控制器

一般情况下 建议在Web应用中捕获自定义异常 在自定义异常中抛出自定义错误代码 并且返回给前端 方便快速排查问题 或者提示用户相关业务的错误信息

①、利用枚举类型 自定义错误代码


/*** 自定义错误类型* */
public enum MyErrorCode {EMPTY_PARAM_ERROR("EMPTY_PARAM_ERROR", "远程调用错误"),REMOTE_ERROR("REMOTE_ERROR", "远程调用错误"),;private final String code;private final String text;MyErrorCode(String code, String text) {this.code = code;this.text = text;}public String getText() {return text;}public String getCode() {return code;}}

②、自定义异常 继承自RuntimeException


/*** 自定义异常* */
public class MyException extends RuntimeException {/*** 错误代码*/private String errorCode;/*** 格式化异常参数*/private List<String> paramList;/*** 最常用的方法* @param MyErrorCode 自定义错误代码*/public MyException(MyErrorCode MyErrorCode) {this(MyErrorCode.getCode(), MyErrorCode.getText(), null);}public MyException(String errorCode, String message) {this(errorCode, message, null);}private MyException(String errorCode, String message, Throwable cause) {super(message, cause);this.errorCode = errorCode;}public MyException(MyErrorCode MyErrorCode, Throwable cause) {this(MyErrorCode.getCode(), MyErrorCode.getText(), cause);}public MyException(MyErrorCode MyErrorCode, List<String> params) {this(MyErrorCode.getCode(), MyErrorCode.getText(), null);this.paramList = params;}public List<String> getParamList() {return paramList;}public void setParamList(List<String> paramList) {this.paramList = paramList;}public String getErrorCode() {return this.errorCode;}
}

③、异常处理类

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.List;@Slf4j
@RestControllerAdvice
public class MyExceptionHandle {@ExceptionHandler(MyException.class)public JsonResult<?> handleMyException(MyException e) {String message = e.getMessage();log.error("current web request error:" + message, e);JsonResult<Object> jsonResult = new JsonResult<>(false, message);String errorCode = e.getErrorCode();jsonResult.setErrCode(errorCode);List<String> paramList = e.getParamList();jsonResult.setData(paramList);return jsonResult;}/*** 处理未知异常** @return JsonResult*/@ExceptionHandler(Exception.class)private JsonResult<?> handleUnKnownException(Exception e) {if (null == e || StringUtils.isBlank(e.getMessage())) {log.error("current web request error:", e);return new JsonResult<Object>(false, "500", "unknownException", e);}String message = e.getMessage();log.error("current web request error:" + message, e);e.printStackTrace();JsonResult<Object> jsonResult = new JsonResult<>(false, "500", message, e);jsonResult.setMsg("unknownException");return jsonResult;}
}

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

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

相关文章

论文学习:基于知识图谱的RAG进行客服问答

1.简介 文章名称&#xff1a; Retrieval-Augmented Generation with Knowledge Graphs for Customer Service Question Answering&#xff08;基于知识图谱的RAG进行客服问答&#xff09; 2.摘要ABSTRACT 在客户服务技术支持中&#xff0c;迅速准确地检索相关的过往问题对于有…

Qt Creator创建一个用户登录界面

目录 1 界面设计 2 代码 2.1 登录界面 2.2 注册界面 2.3 登陆后的界面 3 完整资源 这里主要记录了如何使用Qt Creator创建一个用户登录界面&#xff0c;能够实现用户的注册和登录功能&#xff0c;注册的用户信息存储在了一个文件之中&#xff0c;在登录时可以比对登录信息…

【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出

文章目录 前言增加守护进程1. 编写监控脚本2. 创建 systemd 服务文件3. 启动并启用服务4. 验证服务是否运行注意事项 如何修改守护进程1. 修改监控脚本2. 重新加载并重启服务3. 验证服务是否运行总结 如何设置一个日志文件来查看信息1. 修改监控脚本以记录日志方法一&#xff1…

利用代理IP实现高效大数据抓取的策略与技巧

在当今信息爆炸的时代&#xff0c;数据对于各行各业都至关重要。而数据的获取往往需要通过网络爬取。然而随着网络安全意识的提高和反爬虫机制的加强&#xff0c;传统的数据爬取方式可能会受到限制。在这种情况下&#xff0c;代理IP技术的应用就显得尤为重要。本文将探讨代理IP…

C语言 | Leetcode C语言题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; int countPrimes(int n) {if (n < 2) {return 0;}int isPrime[n];int primes[n], primesSize 0;memset(isPrime, 0, sizeof(isPrime));for (int i 2; i < n; i) {if (!isPrime[i]) {primes[primesSize] i;}for (int j 0; j < …

C++ | Leetcode C++题解之第203题移除链表元素

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* removeElements(ListNode* head, int val) {struct ListNode* dummyHead new ListNode(0, head);struct ListNode* temp dummyHead;while (temp->next ! NULL) {if (temp->next->val val) {…

arco disign vue 日期组件的样式穿透

问题描述: 对日期组件进行样式穿透. 原因分析: 如图,日期组件被展开时它默认将dom元素挂载到body下, 我们的页面在idroot的div 里层, 里层想要穿透外层是万万行不通的. 解决问题: 其实官网提供了参数,但是并没有提供例子, 只能自己摸索着过河. 对于日期组件穿透样式,我们能…

GEO数据挖掘-富集分析、TinyArray简化流程、多组样本分析more

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 富集分析一些理论知识具体代码 富集不到的补救措施更多资料---问题数据和常见错误分析Part4-复杂数据及其分析多分组数据分析流程 tinyarray简化版本分析流程多分组…

如何高效安全的开展HPC数据传输,保护数据安全?

高性能计算&#xff08;HPC&#xff09;在多个行业和领域中都有广泛的应用&#xff0c;像科学研究机构、芯片IC设计企业、金融、生物制药、能源、航天航空等。HPC&#xff08;高性能计算&#xff09;环境中的数据传输是一个关键环节&#xff0c;它涉及到将数据快速、安全地在不…

【嵌入式操作系统(Linux篇)】实验期末复习(1)

以下是关于嵌入式操作系统&#xff08;Linux篇&#xff09;的实验汇总&#xff0c;大概率都是会考的 特别是shell程序和文件IO的操作 嵌入式操作系统实验小结—涉及期末大题 &#xff08;一&#xff09;Linux操作系统的使用实验 1、认识Linux操作系统的目录结构 请进入自己…

代理IP如何助力旅游信息聚合?

在数字化时代&#xff0c;旅游信息聚合对于提升服务质量、优化用户体验起着至关重要的作用。随着在线旅游预订的普及&#xff0c;旅游信息的采集、整合和呈现成为了一个复杂而关键的过程。在这个过程中&#xff0c;代理IP技术以其独特的优势&#xff0c;为旅游信息聚合提供了强…

APP项目测试 之 开发模型和发布

项目客户端一般分为&#xff1a;浏览器端和APP端 APP端分为&#xff1a;手机端&#xff08;安装在手机上的软件&#xff09;和PC端&#xff08;安装在电脑上的软件&#xff09; 1.开发模型 项目迭代速度不同&#xff1a;开发模型不一样 传统行业&#xff1a;瀑布模型 互联网行业…

[数据集][目标检测]水面垃圾水面漂浮物检测数据集VOC+YOLO格式3749张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3749 标注数量(xml文件个数)&#xff1a;3749 标注数量(txt文件个数)&#xff1a;3749 标注…

vue2axios的使用

1.安装axios npm i axios 2.配置代理服务器 1.在config.js中配置单个代理服务器 // 开启代理服务器 需要重新启动项目devServer: {proxy: http://localhost:5000}配置简单&#xff0c;请求资源时直接发给前端&#xff08;8080&#xff09;即可&#xff1b;但不能配置多个代理…

ORB-SLAM2同OpenMVS实现三维重建

ORB-SLAM2 位姿导出 Note: 为与OpenMVS进行对接本次进对ORB-SLAM2进行部分修改&#xff0c;使之可以为 OpenMVS提供稀疏点云、关键帧的位姿、内参&#xff0c;以及稀疏点云在各个View 中的可见性。 主要更改如下 . 在Map文件下增添如下函数 public: void Save(const string &a…

iOS shouldRecognizeSimultaneouslyWithGestureRecognizer 调用机制探索

shouldRecognizeSimultaneouslyWithGestureRecognizer 经常会看到&#xff0c;但是一直没有弄清楚其中的原理和运行机制&#xff0c;今天专门研究下 其运行规律 我们准备三个视图&#xff0c;如下&#xff0c;红色的是绿色视图的父视图&#xff0c;绿色视图 是蓝色视图的父视图…

Feign 配置全局日志存入mongo

1、开启feign日志 在application.yml 添加配置 feign:client:config:default:loggerLevel: FULL2、日志实体类 Document(collection "feignLogs") Data public class FeignLog {Idprivate String id;private String method;private String url;private LocalDate…

CTF-PWN-LLVM-【红帽杯-2021 simpleVM】

文章目录 参考检查逆向漏洞思路调试定位到PASS名exp 参考 https://bbs.kanxue.com/thread-274259.htm#msg_header_h2_6 http://www.blackbird.wang/2022/08/30/LLVM-PASS%E7%B1%BBpwn%E9%A2%98%E6%80%BB%E7%BB%93/ 检查 因为是用opt运行&#xff0c;加载动态库VMPASS.so的P…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(四)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

基于STM32的智能花园灌溉系统

目录 引言环境准备智能花园灌溉系统基础代码实现&#xff1a;实现智能花园灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;花园灌溉管理与优化问题解决方案与优化收尾与总结 1. 引言 智能花园灌溉系统通过使用ST…