概念
在Java中,Exception和Error都是Throwable的子类,用于处理程序中的错误和异常情况。
然而,它们在用途和处理方式上有显著的不同:
Exception:
- 用于表示程序在正常运行过程中可能出现的错误,如文件未找到(FileNotFoundException)、网络连接问题(IOException)等。
- 这些异常可以通过try-catch块捕捉和处理,使程序能够优雅地处理错误,避免崩溃,并继续执行。
- Exception分为Checked和Unchecked两大类。Checked异常在编译时会进行检查,编译器会报错的,必须处理或声明;Unchecked异常(如RuntimeException),也就是运行的时候才知道这玩意有问题,我们可以预判进行处理。
- 常见的Exception子类包括IOException、SQLException等。
Error:
- 表示更严重的、通常无法恢复的错误,如内存不足(OutOfMemoryError)、栈溢出(StackOverflowError)或类找不到(NoClassDefFoundError)。
- 这些错误通常来自系统或JVM层面的问题,超出应用程序的控制范围,处理起来非常困难,甚至可能无法继续运行。
- 通常,Error不会被显式捕捉,因为它们标志着程序可能无法继续运行。在某些情况下,可能尝试记录错误信息后终止程序。
- 常见的Error子类包括OutOfMemoryError、StackOverflowError和NoClassDefFoundError。
扩展知识
- 优先捕获具体异常类型,避免直接捕获Exception。
- 避免在catch块中不做任何处理;若确实无需处理,建议记录日志:“根据设计【链接地址】,此处异常不做处理”。
- 对空指针等常见异常条件应提前检查;通过预防减少异常的发生概率。
- 尽量缩小try-catch块作用域。
- 优先使用if/else替代不必要的异常处理。
- 只捕获并处理可以有效响应的异常,将无法处理的异常向上抛出,遵循逐层异常处理原则。
- 使用try-finally确保资源可靠释放。
- 利用try-with语句管理可以自动关闭的资源。
- 避免过度使用异常机制,预防异常比处理异常更重要。
- 避免在finally块中返回值。
- 不要覆盖try块的正常返回逻辑。
- 记录异常信息时应包含完整堆栈跟踪。