Answers:
错误不应该被发现或处理(在极少数情况下除外)。异常是异常处理的基础。该Javadoc中解释说得好:
错误是Throwable的子类,它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。
查看一些的子类Error
,并获取一些JavaDoc注释:
AnnotationFormatError
-当注释解析器尝试从类文件读取注释并确定注释格式错误时抛出。AssertionError
-被抛出以表明断言失败。LinkageError
-LinkageError的子类表明一个类对另一个类具有一定的依赖性;但是,后一类在前一类编译之后发生了不兼容的变化。VirtualMachineError
-投掷以指示Java虚拟机已损坏或已用尽其继续运行所必需的资源。 确实有三个重要的子类别Throwable
:
Error
-发生了足够严重的错误,大多数应用程序应该崩溃而不是尝试解决问题,RuntimeException
)-通常是编程错误,例如a NullPointerException
或非法参数。应用程序有时可以处理或从该Throwable
类别中恢复-或至少使用Thread的run()
方法来捕获它,记录投诉并继续运行。FileNotFoundException
and TimeoutException
...这张幻灯片通过@ georgios-gousios 显示了Java的异常层次结构,简明地解释了Java中的错误和异常之间的区别。
如您所知,错误往往表明您的应用程序已结束。它通常无法从中恢复,并且应该导致您的VM退出。捕获它们不应该完成,除非可能在退出之前记录或显示并显示适当的消息。
示例:OutOfMemoryError-您无能为力,因为程序不再运行。
异常通常是可恢复的,即使无法恢复,它们通常仅表示尝试的操作失败,但是程序仍然可以继续。
示例:IllegalArgumentException-将无效数据传递给方法,以使方法调用失败,但不会影响以后的操作。
这些是简单的示例,仅在异常方面就有大量信息。
错误 -
Error
java中的s是类型的java.lang.Error
。Error
在运行时发生。它们不会为编译器所知。 Error
s主要是由运行应用程序的环境引起的。 java.lang.StackOverflowError
,java.lang.OutOfMemoryError
例外 -
Exception
java中的s是类型的java.lang.Exception
。Exception
包括选中和未选中的类型。try-catch
块处理异常来从异常中恢复。Exception
s主要是由应用程序本身引起的。SQLException
,IOException
ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
进一步阅读:http : //javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
Error
该类的描述非常清楚:
一个
Error
是的子类Throwable
,表示严重的问题,合理的应用程序不应该试图捕获。大多数此类错误是异常情况。该ThreadDeath
错误尽管是“正常”情况,但也是其子类,Error
因为大多数应用程序不应尝试捕获该错误。不需要方法在其throws子句中声明在
Error
方法执行期间可能抛出但未被捕获的任何子类 ,因为这些错误是不应该发生的异常情况。
从Java自己的class文档中Error
引用。
简而言之,您不应捕获Error
s,除非您有充分的理由这样做。(例如,防止Servlet内存不足或类似情况导致Web服务器的实现崩溃。)
Exception
另一方面,与其他任何现代语言一样,An 只是一个正常的例外。您可以在Java API文档或任何联机或脱机资源中找到详细描述。
类别java.lang.Exception
和类别之间有许多异同java.lang.Error
。
相似之处:
首先-这两个类延伸java.lang.Throwable
,并与错误,如处理时要使用很多都是常见的方法,结果继承:getMessage
,getStackTrace
,printStackTrace
等。
第二,作为它们的子类,java.lang.Throwable
它们都继承以下属性:
java.lang.Error
可以在throws
关键字方法异常列表中声明Throwable本身及其任何子类(包括)。只需要对这样的声明java.lang.Exception
和子类,对java.lang.Throwable
,java.lang.Error
和java.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
方法标题中抛出必需的声明时。错误主要是由运行应用程序的环境引起的。例如,当JVM内存不足时发生OutOfMemoryError,或者当堆栈溢出时发生StackOverflowError。
异常主要是由应用程序本身引起的。例如,当应用程序尝试访问空对象时,将发生NullPointerException;当应用程序尝试转换不兼容的类类型时,将发生ClassCastException。
错误是由您的应用程序或程序运行的环境引起的。大多数情况下,您可能无法从中恢复,因为这会终止您的应用程序或程序。Javadoc建议您不要费心捕捉此类错误,因为无论如何,诸如JVM之类的环境都将退出。
示例:
VirtualMachineError
-抛出该错误以表明Java虚拟机已损坏或已经用尽了继续运行所必需的资源。
OutOfMemoryError
JVM内存不足或StackOverflowError
堆栈溢出
时发生。
异常是由您的应用程序或程序本身引起的;可能是由于您自己的错误。大多数情况下,您可以从中恢复,并且应用程序仍将继续运行。建议您捕获此类错误,以防止应用程序或程序异常终止和/或能够自定义异常消息,以便用户看到格式正确的消息,而不是到处散布的默认丑陋异常消息。
示例:
NullPointerException
当应用程序尝试访问空对象时发生。或尝试使用不存在的索引访问数组或使用错误的数据或参数调用函数。
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
。我知道这引发了一个问题:错误是一个例外吗?,但这就是他们写的。这只是这些示例之一:docs.oracle.com/javase/tutorial/essential/exceptions/…。