基本概念理解:
问题:
- 请对比 Exception 和 Error?
- 运行时异常与一般异常有什么区别?
Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。
如何处理好异常:
了解哪些 Error、Exception 或者 RuntimeException? 详情
NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
当一个类找不到的时候,JVM有时候会抛出ClassNotFoundException异常,而有时候又会抛出NoClassDefFoundError。
ClassNotFoundException | NoClassDefFoundError |
从java.lang.Exception继承,是一个Exception类型 | 从java.lang.Error继承,是一个Error类型 |
当动态加载Class的时候找不到类会抛出该异常 | 当编译成功以后执行过程中Class找不到导致抛出该错误 |
一般在执行Class.forName()、ClassLoader.loadClass()或ClassLoader.findSystemClass()的时候抛出 | 由JVM的运行时系统抛出 |
掌握最基本的语法是必须的,
try-catch-finally 块 (catch不是必须的)
throw、throws 关键字等
异常处理的两个基本原则:
尽量不要捕获类似 Exception 这样的通用异常,而是应该捕获特定异常
不要生吞(swallow)异常
异常处理机制带来的额外的开销:
- try-catch 代码段会产生额外的性能开销,或者换个角度说,它往往会影响 JVM 对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的 try 包住整段的代码;与此同时,利用异常控制代码流程,也不是一个好主意,远比我们通常意义上的条件语句(if/else、switch)要低效。
- Java 每实例化一个 Exception,都会对当时的栈进行快照,这是一个相对比较重的操作。如果发生的非常频繁,这个开销可就不能被忽略了。