exception与错误的区别

我想了解更多关于基本Java和不同types的Throwables,有人可以让我知道exception和错误之间的区别吗?

错误不应该被发现或处理(除了极less数情况)。 例外是exception处理的面包和黄油。 Javadoc解释得很好:

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

看看Error的几个子类,拿一些JavaDoc的评论:

  • AnnotationFormatError – 注释parsing器尝试从类文件读取注释并确定注释格式错误时抛出。
  • AssertionError – 抛出以表示断言失败。
  • LinkageErrorLinkageError子类表示一个类对另一个类有一些依赖; 但是,后一类在编纂前一类之后已经发生了不相适应的变化。
  • VirtualMachineError – 抛出以表明Java虚拟机已损坏或已耗尽其所需的资源以继续运行。

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

  • Error – 某些严重的问题出现了问题,大多数应用程序应该崩溃而不是尝试处理问题,
  • 未经检查的exception(又名RuntimeException ) – 经常出现编程错误,如NullPointerException或非法参数。 应用程序有时可以处理或从Throwable类别中恢复,或者至less在Thread的run()方法中捕获应用程序,logging投诉并继续运行。
  • 检查exception(又名其他) – 应用程序预计能够抓住和有意义地做一些事情,如FileNotFoundExceptionTimeoutException

错误往往表明你的应用程序的结束,因为你知道它。 它通常不能从中恢复,并应导致您的虚拟机退出。 除了在退出之前logging或显示适当的信息之外,不要进行捕获。

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

例外情况往往是可以恢复的,即使没有,通常只是意味着一个尝试的操作失败,但是你的程序仍然可以继续。

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

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

这张幻灯片显示了@ georgios-gousios的 Javaexception层次结构 ,简洁地解释了Java中的错误和exception之间的区别。

Java异常层次结构

Sun 说得最好 :

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

Error类的描述非常清晰:

一个ErrorThrowable一个子类,表示一个合理的应用程序不应该试图捕捉的严重问题。 大多数这样的错误是exception的条件 ThreadDeath错误,尽pipe是一个“正常”的条件,也是Error一个子类,因为大多数应用程序不应该试图捕捉它。

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

引用自Java的类Error的文档 。

总之,除非你有充分的理由这样做,否则你不应该接受Error s。 (例如,如果一个servlet的内存不足或类似的东西阻止你的web服务器的实现崩溃。)

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

java.lang.Exceptionjava.lang.Error之间有几个相似之处和不同之处。

相似点:

  • 首先 – 这两个类扩展了java.lang.Throwable并因此inheritance了许多处理错误时常用的方法,如getMessagegetStackTraceprintStackTrace等。

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

    • Throwable本身及其任何子类(包括java.lang.Error )都可以使用throws关键字在方法exception列表中声明。 这种声明只需要java.lang.Exception和子类,对于java.lang.Throwablejava.lang.Errorjava.lang.RuntimeException及其子类是可选的。

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

    • 只有java.lang.Throwable和子类可以与关键字throw一起使用。

从这个属性得出的结论是: java.lang.Errorjava.lang.Exception都可以在方法头部声明,可以在catch子句中,可以用关键字throw来使用。

区别:

  • 第一个概念上的区别:被devise为由JVM引发的java.lang.Error ,并且指出严重的问题,并且意图停止程序执行而不是被捕获(但是对于任何其他的java.lang.Throwable后继)。

    关于java.lang.Error javadoc描述的一段话:

    表明严重的问题,合理的申请不应该赶上。

    在相反的java.lang.Exceptiondevise用来表示错误的预期和可以由程序员处理,而无需终止程序的执行。

    关于java.lang.Exception javadoc描述的一段话:

    …表示一个合理的应用程序可能想要捕捉的条件。

  • java.lang.Errorjava.lang.Exception之间的第一个被认为是编译时exception检查exception的区别。 因为抛出java.lang.Error或其子类的结果代码不需要在方法头中声明这个错误。 在方法头中抛出java.lang.Exception声明。

Throwable及其后继类图(属性和方法被省略)。 在这里输入图像说明

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

一个错误是Throwable的一个子类,表示一个合理的应用程序不应该试图捕捉的严重问题。 大多数这样的错误是exception的条件 ThreadDeath错误,尽pipe是一个“正常”的条件,也是错误的一个子类,因为大多数应用程序不应该试图捕捉它。

一个方法不需要在throws子句中声明在执行该方法期间可能抛出的错误的任何子类,但是没有被捕获,因为这些错误是不应该发生的exception情况。

OTOH,例外,Java API说:

类Exception和它的子类是一个Throwable的forms,表示一个合理的应用程序可能想要捕获的条件。

海事组织错误是可能导致您的应用程序失败,不应该被处理的东西。 一个例外是会导致不可预知的结果,但可以从中恢复。

例:

如果程序运行内存不足,则应用程序无法继续运行。 但是,如果程序接受不正确的inputtypes,则程序可以处理它并redirect以接收正确的inputtypes。

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

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

来源: 错误与exception之间的区别在Java中

错误 –

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

例外 –

  1. java中的Exception的types是java.lang.Exception
  2. Exception包括既检查也是未检查的types。
  3. 编译器已知检查exception,因为编译器不知道未检查的exception,因为它们在运行时发生。
  4. 您可以通过try-catch块处理exception来恢复exception。
  5. Exception主要是由应用程序本身引起的。
  6. 示例:检查exception: SQLExceptionIOException
    未经检查的exception: ArrayIndexOutOfBoundExceptionClassCastExceptionNullPointerException

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