题
我正在尝试更多地了解基本的 Java 和不同类型的 Throwables,有人可以让我知道异常和错误之间的区别吗?
解决方案
不应捕获或处理错误(除非在极少数情况下)。异常是异常处理的基础。这 Java文档 解释得很好:
Error 是 Throwable 的一个子类,它表示一个 合理的应用程序不应尝试捕捉。大多数此类错误都是不正常的 条件
看一下它的几个子类 Error
, ,摘录他们的一些 JavaDoc 评论:
AnnotationFormatError
- 当注释解析器尝试从类文件读取注释并确定注释格式错误时抛出。AssertionError
- 抛出该异常表示断言失败。LinkageError
- LinkageError 的子类表明一个类对另一个类有一定的依赖性;然而,在前一个类编译后,后一个类发生了不兼容的变化。VirtualMachineError
- 抛出该异常表示 Java 虚拟机已损坏或已耗尽继续运行所需的资源。
实际上有三个重要的子类别 Throwable
:
Error
- 出现了足够严重的问题,大多数应用程序应该崩溃而不是尝试处理问题,- 未经检查的异常(又名
RuntimeException
) - 通常是一个编程错误,例如NullPointerException
或非法论证。应用程序有时可以处理此问题或从中恢复Throwable
类别——或者至少在线程中捕获它run()
方法,记录投诉并继续运行。 - 检查异常(又名其他所有异常)- 应用程序应能够捕获其余异常并对其进行有意义的操作,例如
FileNotFoundException
和TimeoutException
...
其他提示
此滑动示出Java的异常层次通过 @ Georgios的-gousios 简明地解释用Java错误和例外之间的区别。
错误往往会因为你知道它的信号你的应用程序的结束。它通常不能恢复,应该引起你的虚拟机退出。捕捉他们不应除了显示和相应的消息退出之前可能记录或进行。
示例 的OutOfMemoryError - 没有什么可以做的是你的程序不再运行
例外往往是恢复的,即使没有,他们一般只是意味着一个尝试的操作失败了,但是你的程序仍然可以继续。
示例 抛出:IllegalArgumentException - 传递无效数据的方法,这样的方法调用失败,但它不会影响未来的行动
这些是简单的示例,并且存在对单独只是例外信息的另一财富。
说得最好:
的误差的Throwable的子类 表示的严重问题 合理的应用程序不应该尝试 捉。
错误 -
Error
java中的s是类型java.lang.Error
.- java中的所有错误都是未经检查的类型。
Error
发生在运行时。编译器不会知道它们。- 从错误中恢复是不可能的。
Error
大部分是由应用程序运行的环境引起的。- 例子 :
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
例外情况 -
Exception
java中的s是类型java.lang.Exception
.Exception
包括检查型和未检查型。- 编译器已知已检查异常,而编译器不知道未检查异常,因为它们发生在运行时。
- 您可以通过处理异常来从异常中恢复
try-catch
块。 Exception
主要是应用程序本身造成的。- 例子 : 检查异常:
SQLException
,IOException
未经检查的异常:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
进一步阅读: http://javaconceptoftheday.com/difference- Between-error-vs-exception-in-java/
Error
类的描述是很清楚的:
从Java本身的 rel="nofollow类这是
Error
是Throwable
的子类 表示的严重问题 合理的应用程序不应该尝试 去抓。大多数这样的错误是 异常情况。该ThreadDeath
错误,虽然是“正常”的情况下,是 也Error
的子类,因为大多数 应用程序不应该试图捕获 它不要求的方法,在声明 其throws子句中的任何子类
Error
可能在抛出 该方法的执行而不是 抓,因为这些错误 正常情况下应该永远 发生。
Error
的noreferrer">文档。
在短,你不应该赶上Error
s,除非你有一个很好的理由这样做。 (例如,以防止你的Web服务器的实现,如果一个servlet内存用完或类似的东西崩溃。)
这是Exception
,另一方面,仅仅是一个正常的异常如在任何其它现代语言。你会发现在Java API文档中详细描述或任何在线或离线资源。
类之间有一些相同点和不同点 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
方法头中需要声明。
IMO错误的东西,可能会导致应用程序失败,不应该被处理。一个例外是东西,可以导致不可预测的结果,但可从被回收。
示例:
如果一个程序已用完的存储器是错误作为应用程序不能继续。然而,如果程序接受不正确的输入类型是一个例外,因为该程序可以处理它并重定向到接收正确的输入类型。
下面是从Java API一个很好的总结什么错误和异常代表:
这是错误是Throwable的子类,表示严重的问题,合理的应用程序不应该试图捕获。大多数这样的错误都是异常情况。该错误的ThreadDeath,虽然是“正常”的情况下,也是错误的子类,因为大多数应用程序不应该试图抓住它。
不要求的方法,在声明 其throws子句中的任何子类 这可能会在抛出错误 该方法的执行而不是 抓,因为这些错误 正常情况下应该永远 发生。
OTOH,对于异常,Java API的表示:
类异常及其子类是Throwable的一种形式,其指示条件合理的应用程序想要捕获的。
错误主要是由在其中运行应用程序的环境。例如,当OutOfMemoryError异常JVM运行的内存或时的StackOverflowError堆栈溢出发生发生。
异常主要是由应用程序本身。例如,空指针异常时的应用程序试图访问空对象或ClassCastException异常当应用程序试图铸造不相容类类型发生发生。
来源:误差之间差Vs异常在Java