- Java异常面试题(精心整理),你准备好接招了吗?求怕累!
- 内容最后附带阿里巴巴开发手册,整合不易,还请大家认真阅读,并一键三连加关注,给博主一些支持,谢谢了! 笔芯 ❤
正在上传…重新上传取消
文章目录
- Java异常架构与异常关键字
-
- 一. Error 和 Exception 区别是什么?
- 二. 运行时异常和一般异常(受检异常)区别是什么?
- 三. JVM 是如何处理异常的?
- 四. throw 和 throws 的区别是什么?
- 五. final、finally、finalize 有什么区别?
- 六. NoClassDefFoundError 和 ClassNotFoundException 区别?
- 七. try-catch-finally 中哪个部分可以省略?
- 八. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
- 九. 类 ExampleA 继承 Exception,类 ExampleB 继ExampleA。
- 十. 常见的 RuntimeException 有哪些?
-
- 一. 在 finally 块中清理资源或者使用 try-with-resource 语句
-
- 1.使用 finally 代码块
- 2. Java 7 的 try-with-resource 语
- 三. 对异常进行文档说明
- 四. 使用描述性消息抛出异常
- 五. 优先捕获最具体的异常
- 六. 不要捕获 Throwable 类
- 八. 不要记录并抛出异常
- 九. 包装异常时不要抛弃原始的异常
- 十. 不要使用异常控制程序的流程
- 异常处理-阿里巴巴Java开发手册
Java异常架构与异常关键字
一. Java异常简介
Java异常是Java提供的一种识别及响应错误的一致性机制。
二. Java异常架构
1. Throwable
- Throwable 是 Java 语言中所有错误与异常的超类(父类)
- Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。
- Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。
2. Error(错误)
- 定义:Error 类及其子类。程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
- 特点:此类错误一般表示代码运行时 JVM 出现问题。通常有 Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)等。比如 OutOfMemoryError:内存不足错误;StackOverflowError:栈溢出错误。此类错误发生时,JVM 将终止线程。
- 这些错误是不受检异常,非代码性错误。因此,当此类错误发生时,应用程序不应该去处理此类错误。按照Java惯例,我们是不应该实现任何新的Error子类的!
3. Exception(异常)
- 程序本身可以捕获并且可以处理的异常。Exception 这种异常又分为两类:运行时异常和编译时异常。
运行时异常
- 定义: RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。
- 特点: Java 编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。比如NullPointerException空指针异常、ArrayIndexOutBoundException数组下标越界异常、ClassCastException类型转换异常、ArithmeticExecption算术异常。此类异常属于不受检异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。虽然 Java 编译器不会检查运行时异常,但是我们也可以通过 throws 进行声明抛出,也可以通过 try-catch 对它进行捕获处理。如果产生运行时异常,则需要通过修改代码来进行避免。例如,若会发生除数为零的情况,则需要通过代码避免该情况的发生!
- RuntimeException 异常会由 Java 虚拟机自动抛出并自动捕获 (就算我们没写异常捕获语句运行时也会抛出错误!!) ,此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。
编译时异常
- 定义: Exception 中除 RuntimeException 及其子类之外的异常。
- 特点: Java 编译器会检查它。如果程序中出现此类异常,比如 ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws进行声明抛出,要么通过t