异常和错误之间的区别


173

我试图学习有关基本Java和不同类型的Throwables的更多信息,有人可以让我知道Exceptions和Errors之间的区别吗?

Answers:


178

错误不应该被发现或处理(在极少数情况下除外)。异常是异常处理的基础。该Javadoc中解释说得好:

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

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

  • AnnotationFormatError -当注释解析器尝试从类文件读取注释并确定注释格式错误时抛出。
  • AssertionError -被抛出以表明断言失败。
  • LinkageError-LinkageError的子类表明一个类对另一个类具有一定的依赖性;但是,后一类在前一类编译之后发生了不兼容的变化。
  • VirtualMachineError -投掷以指示Java虚拟机已损坏或已用尽其继续运行所必需的资源。

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

  • Error -发生了足够严重的错误,大多数应用程序应该崩溃而不是尝试解决问题,
  • 未检查的异常(aka RuntimeException)-通常是编程错误,例如a NullPointerException或非法参数。应用程序有时可以处理或从该Throwable类别中恢复-或至少使用Thread的run()方法来捕获它,记录投诉并继续运行。
  • Checked Exception(又名“其他所有内容”)-期望应用程序能够捕获其余内容并有意义地执行某些操作,例如FileNotFoundExceptionand TimeoutException...

10
甲骨文说Unchecked exceptions != RuntimeExceptions; Unchecked exceptions = RuntimeExceptions + Errors。我知道这引发了一个问题:错误是一个例外吗?,但这就是他们写的。这只是这些示例之一:docs.oracle.com/javase/tutorial/essential/exceptions/…
ROMANIA_engineer

1
未解决的问题是RuntimeException和Error本质上有何不同?两者都是不受限制的,并且在其他方​​面均相等。
Pacerier,2017年

38

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

Java异常层次结构


6
我希望看到有人从NullPointerException中恢复:D:D:D
Ignacio Soler Garcia

2
@IgnacioSolerGarcia可能是,甚至有道理(另一个问题是它是否好)。通常,您检查对象是否存在,然后调用该方法或使用该字段。但是您可以代替检查是否存在,而尝试捕获NPE。并记录有关此消息的消息,然后继续进行操作。
Gangnus

@Gangnus:没有道理。请记住,异常会跳过部分代码,是一种报告错误而不是正常操作的方式
Ignacio Soler Garcia,

17

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

示例:OutOfMemoryError-您无能为力,因为程序不再运行。

异常通常是可恢复的,即使无法恢复,它们通常仅表示尝试的操作失败,但是程序仍然可以继续。

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

这些是简单的示例,仅在异常方面就有大量信息。


examples.javacodegeeks.com/java-basics/exceptions/…为例。IllegalArgumentException是运行时异常,而不是Error。docs.oracle.com/javase/7/docs/api/java/lang/…–
Gangnus

8

错误 -

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

例外 -

  1. Exceptionjava中的s是类型的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


7

Sun 尽力而为

错误是Throwable的子类,它指示合理的应用程序不应尝试捕获的严重问题。


3

Error该类的描述非常清楚:

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

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

从Java自己的class文档中Error引用。

简而言之,您不应捕获Errors,除非您有充分的理由这样做。(例如,防止Servlet内存不足或类似情况导致Web服务器的实现崩溃。)

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


2

类别java.lang.Exception和类别之间有许多异同java.lang.Error

相似之处:

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

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

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

    • 只有java.lang.Throwable和子类允许在使用catch条款。

    • java.lang.Throwable和子类可与关键字-一起使用throw

此属性的结论都遵循这两个结论,java.lang.Error并且java.lang.Exception可以在方法标题中声明,可以在in catch子句中,可以与keyword一起使用throw

差异:

  • 首先-概念上的差异:java.lang.Error旨在由JVM抛出并表明严重的问题,并且旨在停止程序执行而不是被捕获(但对于任何其他java.lang.Throwable后继者也是可能的)。

    javadoc的一段描述java.lang.Error

    表示严重的问题,合理的应用程序不应试图抓住。

    相反,java.lang.Exception旨在表示程序员可以预期并可以在不终止程序执行的情况下处理的错误。

    javadoc的一段描述java.lang.Exception

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

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

Throwable及其后续类图(省略属性和方法)。 在此处输入图片说明


1

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

例:

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


1

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

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

来源:Java中错误与异常之间的差异


完美的“错误主要由运行应用程序的环境引起”和“异常主要由应用程序本身引起”!
ADJ

0

这是Java API的一个很好的摘要,错误和异常表示:

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

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

OTOH,对于异常,Java API说:

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


0

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.