Java基础-关键字和接口-7、Throwable
1. 异常结构
1.1. Error(错误)
定义:Error 类及其子类。程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
特点:此类错误一般表示代码运行时 JVM 出现问题。通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。这些错误是不受检异常,非代码性错误。因此,当此类错误发生时,应用程序不应该去处理此类错误。按照 Java 惯例,我们是不应该实现任何新的 Error 子类的!
1.2. Exception(异常)
程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。
2. 异常分类
❕ ^u110am
2.1. 运行时异常和编译时异常
2.1.1. 运行时异常
定义:RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。
特点:Java 编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既 “ 没有通过 throws 声明抛出它 “,也 “ 没有用 try-catch 语句捕获它 “,还是会编译通过。比如==NullPointerException 空指针异常、ArrayIndexOutBoundException 数组下标越界异常、ClassCastException 类型转换异常、ArithmeticExecption 算术异常。==此类异常属于不受检异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。虽然 Java 编译器不会检查运行时异常,但是我们也可以通过 throws 进行声明抛出,也可以通过 try-catch 对它进行捕获处理。如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!
RuntimeException 异常会由 Java 虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!),此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。
2.1.2. 编译时异常
定义: Exception 中除 RuntimeException 及其子类之外的异常。
特点: Java 编译器会检查它。如果程序中出现此类异常,比如==ClassNotFoundException(没有找到指定的类异常),IOException(IO 流异常)==,要么通过 throws 进行声明抛出,要么通过 trycatch 进行捕获处理,否则不能通过编译。在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。该异常我们必须手动在代码里添加捕获语句来处理该异常。
2.2. 受检异常与非受检异常
Java 的所有异常可以分为受检异常(checked exception)和非受检异常(uncheckedexception)。
2.2.1. 受检异常
编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。
一旦发生此类异常,就必须采用某种方式进行处理。除 RuntimeException 及其子类外,其他的 Exception 异常都属于受检异常。编译器会检查此类异常,也就是说当编译器检查到应用中的某处可能会此类异常时,将会提示你处理本异常——要么使用 try-catch 捕获,要么使用方法签名中用 throws 关键字抛出,否则编译不通过。
[[pages/002-schdule/001-Arch/001-Subject/013-DemoCode/NOTE_JVM/JVM中篇:字节码与类的加载篇/03-类的加载过程(类的生命周期)详解/README#^d3qqqj]]
2.2.2. 非受检异常⭐️🔴
编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有 try-catch 捕获它,也没有使用 throws 抛出该异常,编译也会正常通过。该类异常包括运行时异常(RuntimeException 极其子类)和错误(Error)。
3. JVM 是如何处理异常的?
3.1. 异常对象
在一个方法中如果发生异常,这个方法会创建一个异常对象,并转交给 JVM,该异常对象==包含异常名称,异常描述以及异常发生时应用程序的状态==。创建异常对象并转交给 JVM 的过程称为抛出异常。可能有一系列的方法调用,最终才进入抛出异常的方法,这一系列方法调用的有序列表叫做调用栈。
JVM 会顺着调用栈去查找看是否有可以处理异常的代码,如果有,则调用异常处理代码。当 JVM 发现可以处理异常的代码时,会把发生的异常传递给它。如果 JVM 没有找到可以处理该异常的代码块,JVM 就会将该异常转交给默认的异常处理器(默认处理器为 JVM 的一部分),默认异常处理器打印出异常信息并终止应用程序。
❕
3.2. 异常表
性能调优专题-基础-1、JVM-异常处理4. ClassNotFoundException 和 NoClassDefFoundError 的区别
https://blog.51cto.com/mingmingruyue/3311182
5. GC 相关
性能调优专题-基础-4、JVM-堆和GC理论6. 实战经验
7. 参考与感谢
[[Java异常面试题 33道.pdf]]