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,一经查实,立即删除!

相关文章

【408计算机组成原理】计算机系统层次结构

计算机系统层次结构 计算机系统由硬件和软件两大部分组成&#xff0c;它们相互作用&#xff0c;共同完成信息处理任务。计算机系统可以分为多个层次&#xff0c;每一层次都有其特定的功能和作用。 硬件层次 输入设备&#xff1a;这些设备负责将用户的指令和数据输入到计算机…

论文学习:基于知识图谱的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;在登录时可以比对登录信息…

Go 常用文件操作

查找文件/目录 os.Stat(String)组合路径 dir, _ : homedir.Dir() filename : args[0] path : filepath.Join(dir, filename)homedir.Dir()为home根目录。 filepath.Join 会自动处理分隔符&#xff0c;将目录和文件名组合成文件路径。 检查是否含有后缀.json strings.HasSu…

【深度学习】常用命令行指令汇总

这些指令对于管理深度学习环境、监控资源使用、调试程序等方面 查看显卡使用情况 要实时监控NVIDIA显卡的状态,可以使用命令: nvidia-smi -l 1这条命令会每秒刷新一次显卡的使用情况,包括GPU利用率、显存使用情况等。 查看当前Python环境 查看当前使用的Python环境,可…

堆排序(手写堆)

堆排序 输入一个长度为 n的整数数列&#xff0c;从小到大输出前 m小的数。 输入格式 第一行包含整数 n和 m。 第二行包含 n个整数&#xff0c;表示整数数列。 输出格式 共一行&#xff0c;包含 m个整数&#xff0c;表示整数数列中前 m小的数。 数据范围 1≤m≤n≤105&…

【运维】如何在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 里层, 里层想要穿透外层是万万行不通的. 解决问题: 其实官网提供了参数,但是并没有提供例子, 只能自己摸索着过河. 对于日期组件穿透样式,我们能…

【TensorFlow深度学习】自我编码器的演变:从基础AE到变分AE模型

自我编码器的演变&#xff1a;从基础AE到变分AE模型 一、基础自我编码器&#xff1a;维度的压缩与重构二、变分自我编码器&#xff1a;从确定性到概率性三、理论与实践的桥梁&#xff1a;变分推理与KL散度四、变分AE的应用拓展五、结论 自我编码器&#xff08;Autoencoder, AE&…

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

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

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

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

DJYGUI AI低代码图形编程开发平台:开启嵌入式软件图形编程新纪元

在科技高速发展的当今时代&#xff0c;软件开发行业对创新和高效的需求日益增长。DJYGUI AI低代码图形编程开发平台的出现&#xff0c;为智能屏、物联屏、串口屏等嵌入式显示设备领域带来了全新的机遇。该平台由都江堰操作系统 AI 代码自动生成平台研发&#xff0c;具有显著的优…

Java中如何使用正则表达式进行字符串匹配和替换?

在Java中&#xff0c;你可以使用java.util.regex包中的正则表达式功能进行字符串匹配和替换。以下是一些基本的使用方法&#xff1a; ### 字符串匹配 你可以使用Pattern和Matcher类来进行正则表达式匹配。下面是一个简单的例子&#xff1a; java import java.util.regex.Patt…

匈牙利命名法,类变量

类变量指的是生存周期在类里的变量&#xff0c;除了这个类就没人认它。网上有很多说的和匈牙利命名法不一致&#xff0c;说静态变量和类变量就是差不多的&#xff0c;其实不是。【面向对象-05】什么是类变量、实例变量、以及区别_类变量和实例变量区别-CSDN博客

【嵌入式操作系统(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;瀑布模型 互联网行业…