异常和错误之间的差异

时间:2009-05-26 19:39:20

标签: java exception throwable

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

11 个答案:

答案 0 :(得分:160)

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

  

错误是Throwable的一个子类,表示a的严重问题   合理的应用不应该试图抓住。大多数此类错误都是异常的   条件。

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

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

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

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

答案 1 :(得分:28)

slide showing Java's exception hierarchy @georgios-gousios简要解释了Java中的错误和异常之间的差异。

Java Exception Hierarchy

答案 2 :(得分:17)

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

示例 OutOfMemoryError - 由于您的程序无法再运行,因此您无能为力。

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

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

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

答案 3 :(得分:7)

Sun puts it best

  

错误是Throwable的子类   这表明存在严重的问题   合理的申请不应该尝试   赶上。

答案 4 :(得分:5)

Errors -

    java中的
  1. Error类型为java.lang.Error
  2. java中的所有错误都是未选中的类型。
  3. Error在运行时发生。编译器不会知道它们。
  4. 无法从错误中恢复。
  5. Error主要是由运行应用程序的环境引起的。
  6. 示例: java.lang.StackOverflowErrorjava.lang.OutOfMemoryError
  7. Exceptions -

      java中
    1. Exception的类型为java.lang.Exception
    2. Exception包括已选中和未选中的类型。
    3. 编译器知道已检查的异常,因为编译器不知道未经检查的异常,因为它们是在运行时发生的。
    4. 您可以通过try-catch块处理异常来恢复异常。
    5. Exception主要由应用程序本身引起。
    6. 示例:已检查的例外情况:SQLExceptionIOException
      未选中的例外:ArrayIndexOutOfBoundExceptionClassCastExceptionNullPointerException
    7. 进一步阅读:http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

答案 5 :(得分:3)

Error类的描述非常明确:

  

ErrorThrowable的子类   这表明存在严重的问题   合理的申请不应该尝试   去抓。大多数此类错误都是   异常情况。 ThreadDeath   错误,虽然是“正常”的条件,但是   也是Error的子类,因为大多数   应用程序不应该尝试捕获   它

     

声明输入不需要方法   它的throws子句的任何子类   可能在此期间被抛出的Error   执行方法但不是   抓住了,因为这些错误是   不应该的异常情况   发生。

引自Java自己的documentation of the class Error

简而言之,你不应该抓住Error,除非你有充分的理由这样做。 (例如,如果servlet内存不足或类似内容,请防止Web服务器的实现崩溃。)

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

答案 6 :(得分:2)

班级java.lang.Exceptionjava.lang.Error之间存在一些相同点和不同点。

<强>相似点:

  • 首先 - 两个类都扩展java.lang.Throwable,因此 继承了许多在交易时常用的方法 有以下错误:getMessagegetStackTraceprintStackTrace和 等等。

  • 其次,作为java.lang.Throwable的子类,它们都继承 以下属性:

    • 可以使用java.lang.Error关键字在方法例外列表中声明Throwable本身及其任何子类(包括throws)。此类声明仅适用于java.lang.Exception和子类,java.lang.Throwablejava.lang.Errorjava.lang.RuntimeException及其子类是可选的。

    • 只允许在java.lang.Throwable子句中使用catch和子类。

    • 只有java.lang.Throwable和子类可用于关键字 - throw

此属性的结论是java.lang.Errorjava.lang.Exception可以在方法标题中声明,可以在catch子句中,可以与关键字throw一起使用

<强>差异:

  • 首先 - 概念差异:java.lang.Error设计为 由JVM引发并指出严重问题并打算停止 程序执行而不是被捕获(但有可能 任何其他java.lang.Throwable继任者)。

    关于java.lang.Error的{​​{3}}描述的段落:

      

    ...表示合理应用应该出现的严重问题   不要试图抓住。

    用于表示错误的对面java.lang.Exception 预期并且可以由程序员处理而不会终止 程序执行。

    关于java.lang.Exception的{​​{3}}描述的段落:

      

    ...表示合理的应用程序可能想要的条件   捉。

  • java.lang.Errorjava.lang.Exception之间的第二个区别,它首先被认为是编译时异常检查的未经检查的异常。结果代码抛出java.lang.Error或其子类不需要在方法头中声明此错误。在方法标题中抛出java.lang.Exception必需的声明。

Throwable及其后继类图(省略了属性和方法)。 javadoc

答案 7 :(得分:1)

IMO错误是导致应用程序失败并且不应该处理的错误。异常会导致不可预测的结果,但可以从中恢复。

示例:

如果程序内存不足,则会出错,因为应用程序无法继续运行。但是,如果程序接受不正确的输入类型,则它是一个例外,因为程序可以处理它并重定向以接收正确的输入类型。

答案 8 :(得分:0)

以下是Java API的一个很好的总结,错误和异常代表了什么:

  

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

     

声明输入不需要方法   它的throws子句的任何子类   在期间可能抛出的错误   执行方法但不是   抓住了,因为这些错误是   不应该的异常情况   发生。

OTOH,对于Exceptions,Java API说:

  

类Exception及其子类是Throwable的一种形式,它表示合理的应用程序可能想要捕获的条件。

答案 9 :(得分:0)

错误主要是由运行应用程序的环境引起的。例如,当JVM内存不足时发生OutOfMemoryError,或者当堆栈溢出时发生StackOverflowError。

例外主要是由应用程序本身引起的。例如,当应用程序尝试访问null对象时发生NullPointerException,或者当应用程序尝试转换不兼容的类类型时发生ClassCastException。

来源:Difference Between Error Vs Exception In Java

答案 10 :(得分:0)

错误是由运行应用程序或程序的环境引起的。大多数情况下,您可能无法从中恢复,因为这会终止您的应用程序或程序。 Javadoc建议您不要因为环境等原因而麻烦捕获此类错误。 JVM,无论如何都会退出此类错误。

示例: VirtualMachineError-抛出该错误消息表明Java虚拟机已损坏或已经用尽了继续运行所必需的资源。 当JVM的内存不足或发生OutOfMemoryError时 堆栈溢出时发生StackOverflowError

异常是由您的应用程序或程序本身引起的;可能是由于您自己的错误。大多数情况下,您可以从中恢复,并且应用程序仍将继续运行。建议您捕获此类错误,以防止应用程序或程序异常终止和/或能够自定义异常消息,以便用户看到格式正确的消息,而不是到处散布的默认丑陋异常消息。

示例: 当应用程序尝试访问空对象时发生NullPointerException。要么 尝试访问不存在的索引数组或使用错误的数据或参数调用函数。