目录
(四) 只在需要 try-catch 的地方 try-catch, try-catch 的范围能小就小
(六) 不要在 finally 代码块中处理返回值或者直接 return
一、前言
这里主要是介绍 Java 中的 Error 和 Exception,它们的共同点和不同点。
二、相同点
通过 UML 类图可以看出, Error 和 Exception 都是继承了 Throwable 类, 在 Java 中只有 Throwable 类的实例才可以抛出(throw)或者捕获(catch),它们表示在程序运行时发生的异常或者错误情况。
三、Error
- 通常用于表示严重的问题,这些问题通常无法再程序中处理和恢复。
- 通常表示系统问题,不建议捕获和处理,因为它们通常表名程序已经处于无法恢复的状态。
通过 UML 图可以让我们更容易理解 Error 的构成(这里只是列举一些比较常见的,感兴趣的可以去了解一下)
四、Exception
- 用于表示应用程序可以捕获并处理的异常情况。
- 可以被抛出、捕获和处理,从而允许程序在遇到问题时采取适当的措施。
- 通常表示程序中出现了某种问题,但这些问题可以通过适当的异常处理来解决,而不影响程序运行。
- 通常可以分为运行异常(Unchecked Exception)和编译异常(Checked Exception)
通过 UML 图可以让我们更容易理解 Exception 的构成(这里只是列举一些比较常见的,感兴趣的可以去了解一下)
- 运行异常(Unchecked Exception):运行时异常,不需要显示捕获,继承自
RuntimeException
- 编译异常(Checked Exception):在编译时必须显示处理(如使用
try-catch
块或者通过throws
声明抛出)
五、不同点
从上面很明显可以看出, Exception
表示可以被处理的程序异常, Error
表示系统级的不可恢复错误。(这个也是面试常问的 Java 基础知识)。
六、处理 Exception 需要注意的事项
(一) 尽量不要捕获类似 Exception 通用的异常
捕获类似 IOException
等详细的异常,尽量避免直接捕获整个Exception
。我们在日常开发中,读代码机会往往超过写代码,捕获更详细的异常,通常能更直观的体现代码的信息,提高可读性。
(二) 不要“吞”了异常
try {
// 业务代码
// …
} catch (IOException e) {
e.printStackTrace();
}
如果不把异常抛出来,或者没有输出到日志,当程序出现异常时候,很难定位到具体位置,会给后续问题定位和维护造成困难。
(三) 不要延迟处理异常
“把问题扼杀在摇篮”,在异常产生的时候就要尽可能去捕获,而不是调用好几个方法才进行捕获。
比如:有个参数为 name 的,在一开始传递的是 null 值,但你没有进行处理,函数内调用了好几个方法都携带这个参数。如果在刚开始就进行捕获,出现异常时候只需要一点信息就可以定位到问题所在的地方。
(四) 只在需要 try-catch 的地方 try-catch, try-catch 的范围能小就小
只在必要的地方(可能出现问题的地方)去捕获异常,而不是把一整段无关代码都包括到try
里面,这样会给影响 JVM 对代码的优化。
(五) 不要通过异常来控制程序流程
一些可以用 if/else 条件判断的地方,就不要使用异常进行处理。异常在效率上会比条件判断更低。
(六) 不要在 finally 代码块中处理返回值或者直接 return
不要在 finally 中 进行 return 或者处理返回值,可能会导致覆盖原有的异常处理。