异常和错误之间的差异

问题

我正在尝试更多地了解基本Java和不同类型的Throwables,有人能告诉我异常和错误之间的区别吗?


#1 热门回答(136 赞)

不应该捕获或处理错误(除了最罕见的情况)。例外是异常处理的基础。 Javadoc解释得很好:

Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题。大多数此类错误都是异常情况。

查看Error的一些子类,获取他们的一些JavaDoc注释:

  • AnnotationFormatError - 当注释解析器尝试从类文件中读取注释并确定注释格式错误时抛出。
  • AssertionError - 抛出以指示断言失败。
  • LinkageError - LinkageError的子类表明一个类对另一个类有一些依赖性;然而,后一类在前一类的编译后发生了不相同的变化。
  • VirtualMachineError - 抛出此异常表示Java虚拟机已损坏或已耗尽其继续运行所需的资源。

Throwable确实有三个重要的子类别:

  • 错误 - 大多数应用程序都应该崩溃而不是试图解决问题的严重问题,
  • 未经检查的异常(又名RuntimeException) - 通常是编程错误,例如NullPointerException或非法参数。应用程序有时可以处理或从此Throwable类别中恢复 - 或者至少在Thread的run()方法中捕获它,记录投诉并继续运行。
  • Checked Exception(又名其他所有) - 应用程序应该能够捕获并有意义地执行其余操作,例如FileNotFoundException和TimeoutException ...

#2 热门回答(21 赞)

Thisslide showing Java's exception hierarchyby@georgios-gousios简明地解释了Java中的错误和异常之间的区别。

Java Exception Hierarchy


#3 热门回答(16 赞)

如你所知,错误往往表示你的应用程序已结束。它通常无法从中恢复,并且应该导致VM退出。除非在退出之前可能记录或显示并显示相应的消息,否则不应该捕获它们。

示例:OutOfMemoryError-由于程序无法再运行,因此无法执行任何操作。

例外通常是可以恢复的,即使不是,它们通常只是意味着尝试的操作失败,但你的程序仍然可以继续。

示例:IllegalArgumentException-将无效数据传递给方法,以便方法调用失败,但不会影响将来的操作。

这些都是简单的例子,仅有例外情况就有另外丰富的信息。