Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java异常总结和Spring事务处理异常机制浅析

Java异常总结和Spring事务处理异常机制浅析

作者头像
IT大咖说
发布于 2020-02-25 03:16:59
发布于 2020-02-25 03:16:59
1.3K00
代码可运行
举报
文章被收录于专栏:IT大咖说IT大咖说
运行总次数:0
代码可运行
异常的概念和Java异常体系结构

异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架,是Java语言健壮性的一个重要体现。

Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

  • 运行时异常 ---> UncheckedException
  • 非运行时异常--->CheckedException
Error和 Exception
  • Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
  • Exception是程序本身可以处理的异常,这种异常分两大类,运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
2、运行时异常和非运行时异常

运行时异常都是RuntimeException类及其子类异常,如

  • NullPointerException、
  • IndexOutOfBoundsException

这些异常是不检查异常(UncheckedException),程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。编译是可以通过的。

非运行时异常是除RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

异常的捕获和处理

Java异常的捕获和处理是一个不容易把握的事情,如果处理不当,不但会让程序代码的可读性大大降低,而且导致系统性能低下,甚至引发一些难以发现的错误。

Java异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws。

try、catch、finally三个语句块应注意的问题
try、catch、finally三个语句块均不能单独使用,三者可以组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个。
try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch语句的顺序是由上到下。
throw、throws关键字

throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。

如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。
如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。

当抛出的是运行时异常,程序可以选择处理和不处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {    try {        FileReader file = new FileReader("d:/entitycode");    } catch (FileNotFoundException e) {        e.printStackTrace();        throw new RuntimeException();    }}

抛出的是非运行时异常时,程序必须要处理,可以继续往外抛,或者捕获

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) throws FileNotFoundException {    try {        FileReader file = new FileReader("d:/entitycode");    } catch (FileNotFoundException e) {        e.printStackTrace();        throw new FileNotFoundException();    }}
throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。下面给出一个简单例子,

Throwable类中的常用方法

  • getCause():返回抛出异常的原因。如果 cause 不存在或未知,则返回 null。
  • getMessage():返回异常的消息信息。
  • printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值。

异常处理的一般原则

能处理就早处理,抛出不去还不能处理的就想法消化掉或者转换为RuntimeException处理。因为对于一个应用系统来说,抛出大量异常是有问题的,应该从程序开发角度尽可能的控制异常发生的可能。
对于检查异常,如果不能行之有效的处理,还不如转换为RuntimeException抛出。这样也让上层的代码有选择的余地――可处理也可不处理。
对于一个应用系统来说,应该有自己的一套异常处理框架,这样当异常发生时,也能得到统一的处理风格,将优雅的异常信息反馈给用户。

Java异常总结

Java将异常区分为Error与Exception,Error是程序无力处理的错误,Exception是程序可以处理的错误。异常处理是为了程序的健壮性。
异常能处理就处理,不能处理就抛出,最终没有处理的异常JVM会进行处理。
异常可以传播,也可以相互转译,但应该根据需要选择合理的异常转译的方向。
对于一个应用系统,设计一套良好的异常处理体系很重要。这一点在系统设计的时候就应该考虑到。
Exception一般分为Checked异常和Runtime异常,所有RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。

Spring事务回滚与异常

Spring被事务管理的方法,需要抛出非检查异常,即运行期异常才能进行回滚

对非检查型类异常可以不用捕获,而检查型异常则必须用try语句块进行处理或者把异常交给上级方法处理总之就是必须写代码处理它。所以必须在service捕获异常,然后再次抛出,这样事务方才起效。

在spring的事务管理环境下,使用unckeckedException可以极大地简化异常的处理,只需要在事务层声明可能抛出的异常(这里的异常可以是自定义的unckecked exception体系),在所有的中间层都只是需要简单throws即可,不需要捕捉和处理,直接到最高层,比如UI层再进行异常的捕捉和处理

在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。

Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked如果遇到checked意外就不回滚。

如何改变默认规则:

  • 1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
  • 2 让unchecked例外不回滚:@Transactional(notRollbackFor=RunTimeException.class)
  • 3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意:如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

一个统一的异常层次结构对于提供服务抽象是必需的。最重要的就是org.springframework.dao.DataAccessException以及其子类了。需要强调的是Spring的异常机制重点在于应用编程模型。与SqlException和其他数据存取API不同的是: Spring的异常机制是为了让开发者使用最少, 最清晰的代码。DataAccessException和其他底层异常都是非检查性异常(unchecked exception)。spring的原则之一就是基层异常就应该是非检查性异常. 原因如下:

  • 基层异常通常来说是不可恢复的。
  • 检查性异常将会降低异常层次结构的价值.如果底层异常是检查性的, 那么就需要在所有地方添加catch语句进行捕获。
  • try/catch代码块冗长混乱,而且不增加多少价值。使用检查异常理论上很好, 但是实际上好象并不如此。Hibernate3也将从检查性异常转为非检查性异常。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java面试集锦(一)之Java异常
异常是在程序执行期间可能发生的错误事件,并且会中断它的正常流程。异常可能来自不同类型的情况,例如用户输入的错误数据,硬件故障,网络连接故障等。
凯哥Java
2022/12/16
1.1K0
Java面试集锦(一)之Java异常
Java异常面试问题
异常是在程序执行期间可能发生的错误事件,并且会中断它的正常流程。异常可能来自不同类型的情况,例如用户输入的错误数据,硬件故障,网络连接故障等。
用户1257393
2018/09/30
1.1K0
Java异常处理和设计
在程序设计中,进行异常处理是非常关键和重要的一部分。一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能。因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基础的知识,然后给出在进行Java异常处理设计时的几个建议。
Java团长
2018/08/07
6290
Java异常面试题(2020最新版)
Java异常架构与异常关键字Java异常简介Java异常架构1. Throwable2. Error(错误)3. Exception(异常)运行时异常编译时异常
用户7886150
2020/12/18
8070
Java异常处理机制
本文从Java异常最基本的概念、语法开始讲述了Java异常处理的基本知识,分析了Java异常体系结构,对比Spring的异常处理框 架,阐述了异常处理的基本原则。并且作者提出了自己处理一个大型应用系统异常的思想,并通过设计一个异常处理的框架来论述此思想。
用户7886150
2021/04/07
1.5K0
Java异常知识点思考与总结
Java 中的异常可以是方法执行过程中引发的,也可以是通过 throw 语句手动抛出的。一旦程序运行过程中发生了异常,JRE 就会试图寻找异常处理程序来处理异常,用具体的异常对象来包装该异常。
happyJared
2018/12/24
7940
Java异常知识点思考与总结
【Java ——异常机制详解】
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
奥耶可乐冰
2024/05/31
2840
spring(基础24) Spring注解@Transactional配置事务
spring(基础24) Spring注解@Transactional配置事务
Java架构师必看
2021/06/17
7430
spring(基础24) Spring注解@Transactional配置事务
Java异常是Java提供的一种识别及响应错误的一致性机制
Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出。Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例。   Java异常机制用到的几个关键字:try、catch、finally、throw、throws。
用户7365393
2021/10/07
6470
Java异常体系中的秘密
相信大家每天都在使用Java异常机制,也相信大家对try-catch-finally执行流程烂熟于胸。本文将介绍Java异常机制的一些细节问题,这些问题虽然很小,但对代码性能、可读性有着较为重要的作用
大闲人柴毛毛
2018/03/29
1.1K0
Java异常体系中的秘密
Java基础-异常机制
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/11/12
4930
Java异常处理和设计
在程序设计中,进行异常处理是非常关键和重要的一部分。一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度。试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻找出错的根源?但是如果一个项目异常处理设计地过多,又会严重影响到代码质量以及程序的性能。因此,如何高效简洁地设计异常处理是一门艺术,本文下面先讲述Java异常机制最基础的知识,然后给出在进行Java异常处理设计时的几个建议。
Spark学习技巧
2019/05/09
1K0
Java异常处理和设计
Java 异常面试问题与解答
异常是在程序执行期间可能发生的错误事件,它会破坏其正常流程。异常可能源于各种情况,例如用户输入的错误数据,硬件故障,网络连接故障等。
淡定的蜗牛
2019/11/01
9690
全面理解java异常机制
Single
2018/01/04
1.2K1
全面理解java异常机制
Java基础系列6:深入理解Java异常体系
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
说故事的五公子
2019/11/15
5930
译文《最常见的10种Java异常问题》
4、为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出的异常不一样呢?
麦洛
2021/03/23
6890
译文《最常见的10种Java异常问题》
Java异常架构与异常关键字
文章目录1.Throwable2.Error(错误)3.Exception(异常)3.1运行Java
Java架构师必看
2021/07/15
5720
Java异常架构与异常关键字
java异常面试题(2021最新版)
又是一年跳槽面试季,最近抽时间整理了一份 Java 异常面试题。或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了。
Java程序猿
2021/04/29
4.1K0
深入理解java异常处理机制
 1. 引子        try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。 <span style="background-color: rgb(255, 255, 255);">package T
大闲人柴毛毛
2018/03/09
9600
深入理解java异常处理机制
为什么阿里规定需要在事务注解 @Transactional 中指定 rollbackFor?
java阿里巴巴规范提示:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback。
程序猿DD
2021/07/13
8520
为什么阿里规定需要在事务注解 @Transactional 中指定 rollbackFor?
相关推荐
Java面试集锦(一)之Java异常
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验