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 exception 级别_Java异常体系概述相关推荐

  1. java exception子类_Java异常 Exception类及其子类(实例讲解)

    C语言时用if...else...来控制异常,Java语言所有的异常都可以用一个类来表示,不同类型的异常对应不同的子类异常,每个异常都对应一个异常类的对象. Java异常处理通过5个关键字try.ca ...

  2. java异常体系_Java异常体系(Throwable、Error、Exception)

    Java异常体系 java异常体系继承图 Throwable Throwable类是所有异常的父类,常见的子类有两个Error.Exception. Error Error类就是程序运行时候抛出的最严 ...

  3. java exception用法_Java基础回顾_Exception异常使用详解

    package 内部类异常包装器; public class 异常 { /** * 1.异常: * 有Error和Exception两个基本子类 * 2.Error: * Error表示恢复不是不可能 ...

  4. java exception e抛异常_Java-------异常处理try{}catch(){Exception e}finally{}

    try{}catch(){}finally{} 异常的概念:Exception 所谓异常就是程序运行过程中出现了意料之外的情况. Error:错误,无需处理.比如:断电 Exception:异常,需要 ...

  5. java异常体系_Java 异常体系

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

  6. java 是否继续_Java异常被抛出或被捕获之后,代码是否继续执行的问题

    在写程序的时候,我们经常被教导,要对异常的信息进行处理,哪里该抛出异常.但是,更多的时候,我们只是模仿异常的抛出,却不知道为什么要这样抛异常(被catch了?被向上抛了?后面的代码是否执行了?). 接 ...

  7. java catch自定义异常_java异常类-java自定义异常-嗨客网

    Java异常类教程 我们在 我们可以看到,在 Exception 表示的是程序中出现了问题,可以直接使用 try - catch 来捕获处理.Error 一般值 Java常见异常 类名 描述 IOEx ...

  8. java catch后面_java 异常被catch后 将会继续执行的操作

    我就废话不多说了,大家还是直接看代码吧~ import java.util.UUID; public class Test { public static void main(String[] arg ...

  9. java网络学习之 jca体系概述(12)

    java安全体系包括以下:JCA.JCE.JSSE.JAAS.JGSS.SASL jca 概述 JCA主要包含了多个服务分别用于数字签名,消息摘要(哈希),证书和证书验证,加密(对称/非对称块/流密码 ...

  10. java catch抛出异常_java异常——捕获异常+再次抛出异常与异常链

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--捕获异常+再次抛出异常与异常链 的相关知识: [1]捕获异常相关 1.1)如果 ...

最新文章

  1. [problem]快速排序和归并排序
  2. Android沉浸式模式状态栏(二)
  3. windows:mysql5.7.29安装
  4. nginx 日志配置log_format用法
  5. Windows进程与线程学习笔记(三)—— KPCR
  6. python无法启动此程序因为计算机中丢失_python报错:无法启动此程序,因为计算机中丢失...
  7. 产品入门首月成长报告 | PMcaff-干货
  8. Java中使用Base64进行编码解码的工具类-将验证码图片使用Base64编码并返回给前端
  9. 获取指定包名下的所有类
  10. 把C#.NET程序移植到DB2上的经验浅谈(C#连接DB2可以用IBM.Data.DB2.dll)
  11. 4倍速!ML.NET Model Builder GPU 与 CPU 对比测试
  12. arcgis快速创建斜坡单元剖面线
  13. 突破传统生物3D打印技术局限-王秀杰/Charlie C.L. Wang/刘永进团队合作开发新型生物3D打印体系...
  14. Ansible之roles使用
  15. 2008秋季-计算机软件基础-0922课堂用例(2)
  16. 登录客户端显示不能连接服务器,客户端不能连接服务器,无法登陆
  17. python数字替换 携程校招
  18. 2018 CCPC网络赛1004 HDU6441 Find Integer
  19. LeaRun快速开发平台,快速开发.net/java项目
  20. 网页调用 iOS/Android 客户端

热门文章

  1. 工厂设计模式究竟怎么写更优雅?!
  2. linux安装json
  3. UVA - 101 The Blocks Problem
  4. Delphi判断是否有全屏程序
  5. QT学习-核心类列表-12、QtDesigner
  6. linux 常用命令 -- 系统管理工具包: 监视邮件的使用情况
  7. still a week before on board
  8. SpringMVC、SpringBoot拦截器的实现和原理
  9. 【Hoxton.SR1版本】Spring Cloud Gateway之如何进行限流
  10. Spring Cloud Config分布式配置中心高可用及配置刷新(学习总结)