exception与错误的区别
我想了解更多关于基本Java和不同types的Throwables,有人可以让我知道exception和错误之间的区别吗?
错误不应该被发现或处理(除了极less数情况)。 例外是exception处理的面包和黄油。 Javadoc解释得很好:
一个错误是Throwable的一个子类,表示一个合理的应用程序不应该试图捕捉的严重问题。 大多数这样的错误是exception的条件
看看Error
的几个子类,拿一些JavaDoc的评论:
-
AnnotationFormatError
– 注释parsing器尝试从类文件读取注释并确定注释格式错误时抛出。 -
AssertionError
– 抛出以表示断言失败。 -
LinkageError
–LinkageError
子类表示一个类对另一个类有一些依赖; 但是,后一类在编纂前一类之后已经发生了不相适应的变化。 -
VirtualMachineError
– 抛出以表明Java虚拟机已损坏或已耗尽其所需的资源以继续运行。
Throwable
确实有三个重要的子类:
-
Error
– 某些严重的问题出现了问题,大多数应用程序应该崩溃而不是尝试处理问题, - 未经检查的exception(又名
RuntimeException
) – 经常出现编程错误,如NullPointerException
或非法参数。 应用程序有时可以处理或从Throwable
类别中恢复,或者至less在Thread的run()
方法中捕获应用程序,logging投诉并继续运行。 - 检查exception(又名其他) – 应用程序预计能够抓住和有意义地做一些事情,如
FileNotFoundException
和TimeoutException
…
错误往往表明你的应用程序的结束,因为你知道它。 它通常不能从中恢复,并应导致您的虚拟机退出。 除了在退出之前logging或显示适当的信息之外,不要进行捕获。
示例:OutOfMemoryError – 由于程序无法再运行,因此无法执行该操作。
例外情况往往是可以恢复的,即使没有,通常只是意味着一个尝试的操作失败,但是你的程序仍然可以继续。
示例:IllegalArgumentException – 将无效数据传递给方法,以使方法调用失败,但不影响将来的操作。
这些都是简单的例子,仅有Exceptions就有另外的丰富的信息。
这张幻灯片显示了@ georgios-gousios的 Javaexception层次结构 ,简洁地解释了Java中的错误和exception之间的区别。
Sun 说得最好 :
一个错误是Throwable的一个子类,表示一个合理的应用程序不应该试图捕捉的严重问题。
Error
类的描述非常清晰:
一个
Error
是Throwable
一个子类,表示一个合理的应用程序不应该试图捕捉的严重问题。 大多数这样的错误是exception的条件ThreadDeath
错误,尽pipe是一个“正常”的条件,也是Error
一个子类,因为大多数应用程序不应该试图捕捉它。一个方法不需要在throws子句中声明在执行该方法期间可能抛出的
Error
任何子类,但是没有被捕获,因为这些错误是不应该发生的exception情况。
引用自Java的类Error
的文档 。
总之,除非你有充分的理由这样做,否则你不应该接受Error
s。 (例如,如果一个servlet的内存不足或类似的东西阻止你的web服务器的实现崩溃。)
另一方面,例外与其他现代语言一样是一个正常的例外。 您将在Java API文档或任何联机或脱机资源中find详细的说明。
类java.lang.Exception
和java.lang.Error
之间有几个相似之处和不同之处。
相似点:
-
首先 – 这两个类扩展了
java.lang.Throwable
并因此inheritance了许多处理错误时常用的方法,如getMessage
,getStackTrace
,printStackTrace
等。 -
其次,作为
java.lang.Throwable
子类,它们都inheritance了以下属性:-
Throwable本身及其任何子类(包括
java.lang.Error
)都可以使用throws
关键字在方法exception列表中声明。 这种声明只需要java.lang.Exception
和子类,对于java.lang.Throwable
,java.lang.Error
和java.lang.RuntimeException
及其子类是可选的。 -
只允许在
catch
子句中使用java.lang.Throwable
和子类。 -
只有
java.lang.Throwable
和子类可以与关键字throw
一起使用。
-
从这个属性得出的结论是: java.lang.Error
和java.lang.Exception
都可以在方法头部声明,可以在catch
子句中,可以用关键字throw
来使用。
区别:
-
第一个概念上的区别:被devise为由JVM引发的
java.lang.Error
,并且指出严重的问题,并且意图停止程序执行而不是被捕获(但是对于任何其他的java.lang.Throwable
后继)。关于
java.lang.Error
javadoc描述的一段话:表明严重的问题,合理的申请不应该赶上。
在相反的
java.lang.Exception
devise用来表示错误的预期和可以由程序员处理,而无需终止程序的执行。关于
java.lang.Exception
javadoc描述的一段话:…表示一个合理的应用程序可能想要捕捉的条件。
-
java.lang.Error
和java.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中
错误 –
- java中的
Error
types是java.lang.Error
。 - java中的所有错误都是未经检查的types。
- 运行时发生
Error
。 编译器不会知道它们。 - 从错误中恢复是不可能的。
-
Error
主要是由运行应用程序的环境引起的。 - 示例:
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
例外 –
- java中的
Exception
的types是java.lang.Exception
。 -
Exception
包括既检查也是未检查的types。 - 编译器已知检查exception,因为编译器不知道未检查的exception,因为它们在运行时发生。
- 您可以通过
try-catch
块处理exception来恢复exception。 -
Exception
主要是由应用程序本身引起的。 - 示例:检查exception:
SQLException
,IOException
未经检查的exception:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
进一步阅读: http : //javaconceptoftheday.com/difference-between-error-vs-exception-in-java/