本文源码:GitHub·点这里 || GitEE·点这里

一、异常简介

优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个重要方面,Java体系中异常框架对于系统开发是十分重要的。

面对系统异常时,不要慌乱,异常虽然是错误,也是系统发出的消息,标识系统的缺陷和需要改进的地方。

二、API体系

Java的API中已经定义许多异常类,分为两大类,错误Error和异常Exception,Throwable作为所有异常的超类,如图:

Error:一般为底层的不可恢复的类,一般此类错误都比较严重,JVM将终止其运行的线程;

  • VirtualMachineError:虚拟机运行错误;
  • OutOfMemoryError:内存溢出;

Exception:程序本身可以捕获并且可以预处理的异常,例如捕获或者抛出;

  • RuntimeException:运行时异常;
  • CheckException:已检查异常,编译阶段必须处理;

几个经典的常见的RunTimeException如下:空指针NullPointerException;数组下标越界ArrayIndexoutofBoundsException等。

三、异常处理

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

应该在合适的位置处理异常,异常的处理准则如下:谁知情谁处理,谁负责谁处理,谁导致谁处理。

1、抛出异常

即异常在当前流程下不处理,一种是直接通过方法传递给调用者,throws关键字是用于在方法声明上声明抛出异常类型的,并且一次可以声明抛出多种类型的异常。throw关键字是用于方法的内部抛出一个异常对象,常在业务校验时抛出提示。

需要特别说明的一点,在Spring框架中,事务触发多数是以是否抛出异常为标识来处理的,如果方法在事务控制内,方法内异常捕获但是最终没有抛出,那该事务则无效。

2、捕获异常

通常捕获异常会使用try-catch-finally关键字三连操作:

Try尝试捕获异常:

如果语句依次执行结束,则跳过catch,在存在finally代码块时,则执行否则执行后续流程;

如果捕获异常,则匹配catch中的类型,如果没有与之匹配的catch类型,则该异常交给JVM处理,finally代码会被执行,流程之后的代码不会被执行;

如果捕获异常且存在相匹配的catch类型,则跳到catch代码块执行,finally代码会被执行,执行完finally代码块之后继续执行后续代码;

Catch匹配可能出现的异常类型,并在其中做补偿处理,例如出现异常情况,需要更新一个异常状态等,如果没有catch块,后必须跟finally块,处理资源释放;

Finally无论是否捕获异常,finally代码会被执行,也是面试中常见的异常问题之一,例如在finally代码块return,或者修改返回值等,主要涉及到值传递和引用传递方面。

3、异常日志

复杂的业务系统必备功能,异常日志体系,用来分析运行问题,作为系统不断优化的核心依据,通常会记录如下几块:

  • 异常类型:分析异常发生的关键原因;
  • 异常信息:通常会简单记录e.getMsg输出的内容;
  • 异常位置:快速定位异常发生的位置[类.方法];
  • 业务参数:特定业务参数场景才能复现的问题;
  • 时间节点:有的并发问题是在特定时间段出现;

异常日志记录下来之后,还会定期进行任务分析,不断发现系统容易出问题的地方,然后再不断的改进和优化。

4、熔断降级

在微服务架构系统下,某个服务故障或者异常,触发熔断该服务,避免引发整个微服务链路异常,防止整个系统服务的雪崩。以此缓解服务器资源的的压力,以保证核心业务的正常运行。

四、源代码地址

GitHub·地址
https://github.com/cicadasmile
GitEE·地址
https://gitee.com/cicadasmile

编程体系结构(02):Java异常体系的更多相关文章

  1. Java异常体系概述

    Java的异常体系结构 Java异常体系的根类是 Throwable, 所以当写在java代码中写throw抛出异常时,后面跟的对象必然是Throwable或其子类的对象. 其中Exception异常 ...

  2. Java 异常体系(美团面试)

    Java把异常作为一种类,当做对象来处理.所有异常类的基类是Throwable类,两大子类分别是Error和Exception. 系统错误由Java虚拟机抛出,用Error类表示.Error类描述的是 ...

  3. java(异常体系及权限修饰符)

    java异常体系 异常的体系: 异常体系: --------| Throwable 所有错误或者异常的父类 --------------| Error(错误) --------------| Exce ...

  4. Java基础系列5:深入理解Java异常体系

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 前言: Java的基 ...

  5. Java——深入理解Java异常体系

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 前言: Java的基 ...

  6. JAVA异常体系

    1.异常体系 ----|Throwable 所有错误或异常的父类 --------|Error(错误) --------|Exception(异常)一般能通过代码处理 ------------|运行时 ...

  7. Java异常体系及分类

    上图是基本的java异常体系结构. 主要分为2大类:Error和Exception 1.Error:描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象,一般是由虚拟 ...

  8. Java异常体系简析

    最近在阅读<Java编程思想>的时候看到了书中对异常的描述,结合自己阅读源码经历,谈谈自己对异常的理解.首先记住下面两句话: 除非你能解决这个异常,否则不要捕获它,如果打算记录错误消息,那 ...

  9. Java异常处理-----java异常体系

    再三思考后还是决定贴图,csdn的格式,我是真玩不转,对不起了各位,继续将就吧. 错误原因:内存溢出.需要的内存已经超出了java虚拟机管理的内存范围. 错误原因:找不到类文件. 错误(Error): ...

随机推荐

  1. 团队项目-记账App

    一.团队成员介绍 队长: 向瑜 博客园地址: https://www.cnblogs.com/xiangyu721/  沟通能力较强,善于总结,能够正确分配团队任务.其次,有耐心学习新事物,发现新问题 ...

  2. Linux学习笔记之ubuntu安装与配置

    1.打开虚拟机,点击新建虚拟机 2.安装向导 选择自定义安装 点击包含一个空白的硬盘 选择linux操作系统,版本是ubuntu 设置虚拟机的名称,可以自己写,还有保存的位置也可自选 根据自己电脑性能 ...

  3. js 排他思想案例

    <!-- 排他思想 --> <button>按钮1</button> <button>按钮2</button> <button> ...

  4. javascript数组笔记

    1.数组 2.利用new创建数组 var arr= new Array(); 3.利用数组字面量创建数组 var 数组名=[]; 4.数组里面的数据叫 5.数组的索引(数组下标从0开始) 6.遍历数组 ...

  5. ConHost.exe机制

  6. 37 Reasons why your Neural Network is not working

    37 Reasons why your Neural Network is not working Neural Network Check List 如何使用这个指南 数据问题 检查输入数据 试一下 ...

  7. java 用集合完成随机点名器和库存管理案例

    一 随机点名器 1.案例需求 随机点名器,即在全班同学中随机的找出一名同学,打印这名同学的个人信息. 我们来完成随机点名器,它具备以下3个内容: 存储所有同学姓名 总览全班同学姓名 随机点名其中一人, ...

  8. K均值聚类和DBSCAN介绍

    K均值(K-means)聚类 问题定义:给定数据$\vec{x}_1,\vec{x}_2,\cdots,\vec{x}_n$,将它们分到不同的$K$个簇(cluster)中.定义$\vec{c}=(c ...

  9. Linux top详解

    命令 top 参数说明: d:改变显示的更新速度 q:  没有任何延迟的显示速度 c:切换显示模式,共有两种模式,一是只显示执行档的名称,零一种显示完整的路径与名称S:累计模式,会将已完成或消失的子行 ...

  10. Linux系统中有趣的命令(可以玩小游戏)

    Linux系统中有趣的命令(可以玩小游戏) 前言 最近,我在看一些关于Linux系统的内容,这里面的内容是真的越学越枯燥,果然学习的过程还是不容易的.记得前几个月初学Linux时,有时候就会碰到小彩蛋 ...