异常和错误之间的差异

Mar*_*ung 162 java exception throwable

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

Edd*_*die 170

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

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

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

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

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

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

  • Oracle说"未经检查的异常!= RuntimeExceptions"; `未经检查的异常= RuntimeExceptions + Errors`.我知道它提出了一个问题:*错误是一个例外吗?*,但这是他们写的.以下是其中一个示例:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html. (7认同)

ava*_*sen 32

这张幻灯片显示@ georgios-gousios的Java异常层次结构,简要地解释了Java中的错误和异常之间的区别.

Java异常层次结构

  • 我很想看到有人从NullPointerException中恢复过来:D:D:D (4认同)
  • @IgnacioSolerGarcia 可以,甚至有道理(另一个问题是它是否好)。通常你检查对象是否存在,然后调用方法或使用字段。但是您可以尝试捕获 NPE,而不是检查是否存在。例如,记录一条关于它的消息并继续。 (2认同)

Rob*_*bin 17

如您所知,错误往往表示您的应用程序已结束.它通常无法从中恢复,并且应该导致VM退出.除了在退出之前可能记录或显示和适当的消息之外,不应该捕获它们.

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

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

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

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


Pow*_*ord 7

Sun 说得最好:

Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题.


roo*_*ler 7

错误 -

  1. Errorjava中的s是type java.lang.Error
  2. Java中的所有错误均为未经检查的类型。
  3. Error在运行时发生。它们不会为编译器所知。
  4. 从错误中恢复是不可能的。
  5. Errors主要是由运行应用程序的环境引起的。
  6. 例如: java.lang.StackOverflowErrorjava.lang.OutOfMemoryError

例外 -

  1. Exceptionjava中的s是type java.lang.Exception
  2. Exception包括选中和未选中的类型。
  3. 检查异常是编译器已知的,未检查异常是编译器不知道的,因为它们在运行时发生。
  4. 您可以通过try-catch块处理异常来从异常中恢复。
  5. Exceptions主要是由应用程序本身引起的。
  6. 例如:检查异常:SQLExceptionIOException
    unchecked异常:ArrayIndexOutOfBoundExceptionClassCastExceptionNullPointerException

进一步阅读:http : //javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png


Tob*_*ler 5

该类的描述Error非常清楚:

AnError是其子类Throwable ,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误都是异常情况。该ThreadDeath 错误虽然是“正常”情况,但也是 的一个子类,Error因为大多数应用程序不应尝试捕获它。

方法不需要在其 throws 子句中声明 Error在方法执行期间可能抛出但未被捕获的任何子类,因为这些错误是永远不应该发生的异常情况。

引用自 Java 自己的类文档Error

简而言之,Error除非您有充分的理由,否则您不应该捕获 s。(例如,如果 servlet 内存不足或类似情况,防止 Web 服务器的实现崩溃。)

Exception另一方面,与任何其他现代语言一样,An只是一个正常的例外。您可以在 Java API 文档或任何在线或离线资源中找到详细说明。