2009-05-26 119 views

回答

128

错误不应被发现或处理(除了最罕见的情况)。例外是异常处理的面包和黄油。该Javadoc解释说得好:

一个错误是Throwable的子类,表示严重的问题,一个 合理的应用程序不应该试图捕获。大多数这样的错误是 条件异常。

看几的Error的子类,以他们的一些JavaDoc注释:

  • AnnotationFormatError - 当注释分析器试图从类文件读取注释并确定注释时抛出是畸形的。
  • AssertionError - 抛出以指示断言失败。
  • LinkageError - LinkageError的子类表明一个类对另一个类有一些依赖关系;然而,后一类在编写前一类后变得不相适应。
  • VirtualMachineError - 抛出以表明Java虚拟机已损坏或已耗尽其所需的资源以继续运行。

有真正的Throwable三个重要子类:

  • Error - 这足够严重的已经错了大多数应用程序崩溃,而不是试图来处理这个问题,
  • 未经检查的异常(又名RuntimeException ) - 经常出现编程错误,如NullPointerException或非法参数。应用程序有时可以处理或从这个Throwable类别中恢复 - 或者至少在Thread的run()方法中捕获它,记录投诉并继续运行。
  • 的Checked Exception(又名其他的一切) - 应用程序预计将能够赶上和有意义的做一些事情,其余的,如FileNotFoundExceptionTimeoutException ...
+6

甲骨文说,'未检查异常= RuntimeExceptions`;! `未经检查的异常= RuntimeExceptions +错误`。我知道这引发了一个问题:*错误是一个例外吗?*,但这是他们写的。以下是其中一个示例:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html。 – 2016-05-14 15:02:22

16

错误往往会显示你的应用程序的结束如你所知。它通常无法从中恢复,并应导致您的虚拟机退出。捕捉它们不应该完成,除了在退出之前可能记录或显示适当的消息。

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

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

例子: 抛出:IllegalArgumentException - 传递无效数据的方法,这样的方法调用失败,但它不会影响未来的行动。

这些都是简单的例子,仅有例外就有很多信息。

7

puts it best

一个错误是Throwable的 一个子类,表示严重的问题,一个 合理应用程序不应该试图 赶上。

3

Error类的描述是相当清楚的:

ErrorThrowable 一个子类,表示严重的问题,一个 合理应用程序不应该试图 赶上。大多数此类错误是 异常情况。 ThreadDeath 错误,尽管“正常”的条件, 也是Error的子类,因为大多数 应用程序不应该试图赶上 它。

的方法不需要申报 其throws子句中的 Error可能的 执行方法的过程中被抛出,但不是 抓到任何的子类,因为这些错误是 从不 应该发生异常情况。

来自Java自己的documentation of the class Error

总之,你不应该赶上Error s,除非你有充足的理由这样做。 (例如,为了防止在servlet运行内存不足或类似情况时执行web服务器崩溃)

另一方面,Exception与其他任何现代语言一样都是正常的例外。您将在Java API文档或任何联机或脱机资源中找到详细的说明。

0

下面是从Java API的一个很好的总结什么错误和异常表示:

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

的方法不需要申报 其throws子句中可能的 执行方法的过程中被抛出,但不是 抓住 错误的任何子类,因为这些错误是 从不 应该发生异常情况。

OTOH,为例外,Java API的说:

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

0

IMO错误是可能导致您的应用程序失败,不应处理的错误。例外情况会导致不可预知的结果,但可以从中恢复。

实施例:

如果一个程序已用完的存储器是错误作为应用程序不能继续。但是,如果程序接受不正确的输入类型,则程序可以处理它并重定向以接收正确的输入类型,这是一个例外。

0

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

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

来源:Difference Between Error Vs Exception In Java

2

有几个相似性和类java.lang.Exceptionjava.lang.Error之间的差异。

相似点:

  • 首先 - 两个类延伸java.lang.Throwable并且作为结果 继承很多都是常见的有错误,如处理 时所使用的方法:getMessagegetStackTraceprintStackTrace如 等。

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

    • Throwable的本身及其任何亚类(包括java.lang.Error)的可使用throws关键字方法例外列表中声明。这种声明只需要java.lang.Exception和子类,java.lang.Throwable,java.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后继者)。

    javadoc描述的通道约java.lang.Error

    ...表示严重的问题,一个合理的应用程序应该 不要试图捕捉。

    在相反java.lang.Exception设计成表示的错误, 预期并且可以由程序员不终止 程序执行处理。

    javadoc描述的通道约java.lang.Exception

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

  • java.lang.Errorjava.lang.Exception之间的第二个不同在于第一认为是未经检查例外编译时异常检查。由于结果代码抛出java.lang.Error或其子类不需要在方法头中声明此错误。同时在方法头中抛出java.lang.Exception所需的声明。

Throwable及其后继类图(属性和方法被省略)。 enter image description here

2

Errors -

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

Exceptions -

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

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

相关问题