Java的异常体系结构

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

其中Exception异常是指一些可以恢复的异常, 例如常见的NullPointerException空指针异常。

Error指的是一些致命的错误,无法通过程序代码手段恢复的异常,例如OutOfMemoryError内存溢出错误。

unchecked异常

在上图中除了RuntimeException、Error及其子类都是属于unchecked的异常类型外,其他的都是受编译器checked检查的异常。

unchecked不受编译器检查的异常, 是因为这些错误在程序运行过程中是可以通过编程手段去控制住的,

例如常见的NullPointerException空指针异常和IndexOutOfBoundsException数组下标越界的异常,这些都可以事先使用if (xx != null) 以及 if (xxx.size() > i)来控制,

或者就是完全无法通过程序手段控制,

例如OutOfMemoryError内存溢出异常和StackOverflowError栈溢出异常,这种Error因为无法通过代码层面if就能避免的,所以也属于unchecked。

checked异常

checked在编译过程中受到编译器的检查,如果程序没有对该异常做catch处理或者向上一层抛出的话,程序将无法编译通过,

常见的checked异常有FileNotFoundException文件不存在异常等,因为这种异常在编写阶段就可以预见,例如这个文件极有可能是不存在的,所以这种异常必须要抛出并要求程序作出处理。

总结

Throwable任何异常/错误的祖先类,属于checked异常。

Exception异常,可以从异常中恢复执行的异常,属于checked异常。

RuntimeException异常,预料之外的异常例如空指针、数组越界,属于unchecked异常。

...Exception除了RuntimeException及其子类是unchecked异常,其他的Exception类都是checked异常。

Error错误,致命问题,无法从错误中恢复, 也属于unchecked异常。

在开发过程中,如果一些可以预料的到的错误抛出异常时,尽量抛出checked异常,例如那个文件、某个数据一定可能会不存在的情况下,就要提示该方法的调用者,需要对这种情况进行处理,

如果是一些预料之外的异常,则可以使用RuntimeException,例如某个值规定一定是必须不为空,但是程序判断时为空了,则要进行RuntimeException的抛出。

面试题

什么是checked/unchecked/runtime exception?

  • checked exception指的是除了Error、Runtime Exception及其子类之外的所有异常,
  • unchecked exception指的是Error、Runtime Exception及其子类的异常,
  • runtime exception属于unchecked异常。

try/catch/finally的执行顺序

  • try用于包含运行时的代码块,第一步执行,
  • catch用于捕获代码运行时可能发生的异常,第二步执行

    当代码块执行到某一步发生错误时,后面的代码将不会进行执行,

    而是跳转到catch的代码块中,catch顺序由上而下,以第一个可以捕获到当前异常的catch进行执行其中的内容,
  • finally是程序不管有没有发生异常,这里的代码最终一定会执行,所以是第三步执行。

在finally中return数据会怎么样

由于finally在不管什么情况下都会执行,所以finally中的return或覆盖掉其他地方的return,最终以finally返回的为主,图中最终返回结果是2。

throw和throws的区别

  • throw是用于在程序运行过程中,如果碰到了觉得不正确的值或者结果,可以通过throw new XXX()来抛出一个异常,终止当前程序的继续执行。
  • throws是用于在方法签名上指出该方法将抛出什么异常,告诉调用者,调用此方法可能会产生的异常,让调用者做相应的处理。

final、finally、finalize的区别

  • final用于修饰类、方法、变量,在类上该类不可被继承,在方法上,该方法不可被重写,在变量上,该变量引用不可被更改。
  • finally用于在try语句中,意味着finally包含的代码必须执行,不管有没有异常。
  • finalize是所有对象的一个方法,在该对象被回收前,将会被垃圾回收器调用,但是只会调用一次,一般可以在该方法中挽救当前将被回收的对象,例如使用一个变量引用当前对象,但是这种方式不可取,因为垃圾回收器不会保证该方法被执行完毕,可能正在赋值的过程中该对象就被回收了,

    这个方法类似C++的析构函数,但是不稳定,官方也不推荐使用,只是因为历史原因,为了让C++程序员更适应Java作出的一个妥协。

结语

欢迎关注微信公众号『码仔zonE』,专注于分享Java、云计算相关内容,包括SpringBoot、SpringCloud、微服务、Docker、Kubernetes、Python等领域相关技术干货,期待与您相遇!

Java异常体系概述的更多相关文章

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

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

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

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

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

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

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

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

  5. JAVA异常体系

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

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

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

  7. Java异常体系及分类

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

  8. Java异常体系简析

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

  9. java 异常体系详细介绍

    一.异常概述与异常体系结构 异常:在Java语言中,将程序执行中发生的不正常情况称为"异常".(开发过程中的语法错误和逻辑错误不是异常). Java把异常当作对象来处理,并定义一个 ...

随机推荐

  1. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  2. PyQt(Python+Qt)学习随笔:QDockWidget停靠部件的setWidget和widget方法

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 QDockWidget对象由一个标题栏和内容区域组成.QDockWid ...

  3. 第15.3节 PyCharm程序调试功能介绍

    一. 代码调试 点击工具栏的调试按钮(如下图蓝色圈标记按钮)可以进行程序调试,可以在调试前先设置断点,断点设置就是在打开文件的行与前面的行号之间用鼠标单击进行设置和取消(如下图蓝色下划线上面的实体圆点 ...

  4. PyQt(Python+Qt)学习随笔:视图中的拖放操作注意事项

    老猿Python博文目录 老猿Python博客地址 在通过PyQt构建的图形界面中进行拖放,要成功进行拖放需要注意: 视图相关属性需要支持拖放,具体相关属性请参考<PyQt(Python+Qt) ...

  5. js- for in 循环 只有一个目的,遍历 对象,通过对象属性的个数 控制循环圈数

    for in 循环会返回 原型 以及原型链上面的属性,不会打印系统自带的属性 var obj ={  name:'suan',  sex :'male',  age:150,  height:185, ...

  6. 几句话说明 .NET MVC中ViewData, ViewBag和TempData的区别

    ViewData和TempData是字典类型,赋值方式用字典方式, ViewData["myName"] ViewBag是动态类型,使用时直接添加属性赋值即可 ViewBag.my ...

  7. es6 数组新增方法

    1.Array.from(): 这个函数的作用是将类似数组的对象转化为数组,比如DOM对象 let arrayLike = {      "0":"TangSir&quo ...

  8. CF1457D XOR-gun

    这道题真的把我秀到了,我首先猜了一波结论,打了一个可持久化 \(\text{Trie}\) 加二分的两只 \(\log_2\) 的做法,发现不能 \(PP\) ,然后就一直改到比赛结束还没改过. 然后 ...

  9. Android开源项目分类汇总-转载

    太长了,还是转载吧...今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参 ...

  10. double类型和int类型的区别

    引例: double a=19*3.3; System.out.print(a); 结果为62.9999996,不是62.7:这里不单纯是因为给的是double类型 (1) 62.7 和 62.699 ...