我想了解更多关于基本Java和不同类型的Throwables,有人可以让我知道异常和错误之间的区别吗?异常和错误之间的区别
回答
错误不应被发现或处理(除了最罕见的情况)。例外是异常处理的面包和黄油。该Javadoc解释说得好:
一个错误是Throwable的子类,表示严重的问题,一个 合理的应用程序不应该试图捕获。大多数这样的错误是 条件异常。
看几的Error
的子类,以他们的一些JavaDoc注释:
AnnotationFormatError
- 当注释分析器试图从类文件读取注释并确定注释时抛出是畸形的。AssertionError
- 抛出以指示断言失败。LinkageError
- LinkageError的子类表明一个类对另一个类有一些依赖关系;然而,后一类在编写前一类后变得不相适应。VirtualMachineError
- 抛出以表明Java虚拟机已损坏或已耗尽其所需的资源以继续运行。
有真正的Throwable
三个重要子类:
Error
- 这足够严重的已经错了大多数应用程序崩溃,而不是试图来处理这个问题,- 未经检查的异常(又名
RuntimeException
) - 经常出现编程错误,如NullPointerException
或非法参数。应用程序有时可以处理或从这个Throwable
类别中恢复 - 或者至少在Thread的run()
方法中捕获它,记录投诉并继续运行。 - 的Checked Exception(又名其他的一切) - 应用程序预计将能够赶上和有意义的做一些事情,其余的,如
FileNotFoundException
和TimeoutException
...
错误往往会显示你的应用程序的结束如你所知。它通常无法从中恢复,并应导致您的虚拟机退出。捕捉它们不应该完成,除了在退出之前可能记录或显示适当的消息。
示例: OutOfMemoryError - 由于您的程序无法再运行,因此无法执行任何操作。
异常通常是可恢复的,即使没有异常,它们通常只是意味着尝试的操作失败,但您的程序仍然可以继续。
例子: 抛出:IllegalArgumentException - 传递无效数据的方法,这样的方法调用失败,但它不会影响未来的行动。
这些都是简单的例子,仅有例外就有很多信息。
一个错误是Throwable的 一个子类,表示严重的问题,一个 合理应用程序不应该试图 赶上。
的Error
类的描述是相当清楚的:
的
Error
是Throwable
一个子类,表示严重的问题,一个 合理应用程序不应该试图 赶上。大多数此类错误是 异常情况。ThreadDeath
错误,尽管“正常”的条件, 也是Error
的子类,因为大多数 应用程序不应该试图赶上 它。的方法不需要申报 其throws子句中的
Error
可能的 执行方法的过程中被抛出,但不是 抓到任何的子类,因为这些错误是 从不 应该发生异常情况。
来自Java自己的documentation of the class Error
。
总之,你不应该赶上Error
s,除非你有充足的理由这样做。 (例如,为了防止在servlet运行内存不足或类似情况时执行web服务器崩溃)
另一方面,Exception
与其他任何现代语言一样都是正常的例外。您将在Java API文档或任何联机或脱机资源中找到详细的说明。
下面是从Java API的一个很好的总结什么错误和异常表示:
一个错误是Throwable的子类,表示严重的问题,合理的应用程序不应该试图捕获。大多数此类错误都是异常情况。 ThreadDeath错误虽然是一个“正常”条件,但也是Error的一个子类,因为大多数应用程序不应该试图捕获它。
的方法不需要申报 其throws子句中可能的 执行方法的过程中被抛出,但不是 抓住 错误的任何子类,因为这些错误是 从不 应该发生异常情况。
OTOH,为例外,Java API的说:
的Exception类及其子类是Throwable的一种形式,它指出的条件合理的应用程序想要捕获的。
IMO错误是可能导致您的应用程序失败,不应处理的错误。例外情况会导致不可预知的结果,但可以从中恢复。
实施例:
如果一个程序已用完的存储器是错误作为应用程序不能继续。但是,如果程序接受不正确的输入类型,则程序可以处理它并重定向以接收正确的输入类型,这是一个例外。
错误主要是由运行应用程序的环境引起的。例如,当JVM内存不足时发生OutOfMemoryError,或者当堆栈溢出时发生StackOverflowError。
异常主要是由应用程序本身引起的。例如,当应用程序尝试访问空对象时发生NullPointerException,或者当应用程序尝试转换不兼容的类类型时发生ClassCastException。
有几个相似性和类java.lang.Exception
和java.lang.Error
之间的差异。
相似点:
首先 - 两个类延伸
java.lang.Throwable
并且作为结果 继承很多都是常见的有错误,如处理 时所使用的方法:getMessage
,getStackTrace
,printStackTrace
如 等。其次,作为
java.lang.Throwable
是子类它们都继承 以下属性:Throwable的本身及其任何亚类(包括
java.lang.Error
)的可使用throws
关键字方法例外列表中声明。这种声明只需要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
可以在方法头被声明,可以在catch
子句,可以用关键字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
所需的声明。
这slide showing Java's exception hierarchy由@georgios-gousios简洁地解释了Java中的错误和异常之间的区别。
Errors -
Error
S IN的java是java.lang.Error
类型。- java中的所有错误都是未经检查的类型。
Error
s在运行时发生。编译器不会知道它们。- 从错误中恢复是不可能的。
Error
s主要是由运行应用程序的环境引起的。- 实例:
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exception
S IN的java是java.lang.Exception
类型。Exception
s包括检查以及未检查类型。- 编译器已知检查异常,因为编译器不知道未检查的异常,因为它们在运行时发生。
- 您可以通过在
try-catch
块中处理例外来恢复异常。 Exception
s主要是由应用程序本身引起的。- 例子:检查异常:
SQLException
,IOException
unchecked异常:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
进一步阅读:http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
- 1. 异常和错误之间的区别?
- 2. C++异常和结构化异常之间的区别
- 3. 错误与java中未经检查的异常之间的区别?
- 4. 错误与异常有什么区别?
- 5. 错误与失败之间的区别
- 6. 投掷和投掷之间有什么区别异常
- 7. Javascript中的错误和异常有什么区别
- 8. '+ ='和'= +'之间的区别?
- 9. {!!之间的区别!!}和{{}}
- 10. ==和case之间的区别?
- 11. '#','%'和'$'之间的区别
- 12. | =和^ = css之间的区别
- 13. “%〜dp0”和“。\”之间的区别?
- 14. .eq之间的区别。和==
- 15. ==和.equals()之间的区别?
- 16. `%in%`和`==`之间的区别
- 17. 未经检查的异常或运行时异常之间的区别
- 18. 错误处理模块中的Resume和Goto之间的区别
- 19. 编译器的信号和错误之间的区别(sbcl 1.2.4)
- 20. web.xml错误500和struts全局异常有什么区别?
- 21. 导轨之间的区别与差异
- 22. 阵列差异之间的区别
- 23. 语义错误与逻辑错误之间的区别
- 24. github API提交状态“失败”和“错误”之间的区别?
- 25. Xcode Project和Playground之间关于Swift错误处理的区别
- 26. JSF 1.2异常行为与actionListener之间的区别
- 27. 索引超出范围异常和数组异常之外的索引之间有什么区别?
- 28. SPFile和PublishingPage类别之间的区别
- 29. System.Timers.Timer Enabled = true和.Start()之间的区别Enabled = true和.Start()之间的区别
- 30. 最终变量和编译时间常量之间的区别
甲骨文说,'未检查异常= RuntimeExceptions`;! `未经检查的异常= RuntimeExceptions +错误`。我知道这引发了一个问题:*错误是一个例外吗?*,但这是他们写的。以下是其中一个示例:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html。 – 2016-05-14 15:02:22