我正在尝试了解有关基本 Java 和不同类型的 Throwables 的更多信息,有人可以让我知道异常和错误之间的区别吗?
11 回答
不应捕获或处理错误(极少数情况除外)。异常是异常处理的基础。Javadoc很好地解释了它:
Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。
查看 的一些子类Error
,获取它们的一些 JavaDoc 注释:
AnnotationFormatError
- 当注释解析器尝试从类文件中读取注释并确定注释格式错误时抛出。AssertionError
- 抛出表示断言失败。LinkageError
- LinkageError 的子类表明一个类对另一个类有一些依赖;但是,后一个类在前一个类编译后发生了不兼容的变化。VirtualMachineError
- 抛出表示 Java 虚拟机已损坏或已用完继续运行所需的资源。
实际上有三个重要的子类别Throwable
:
Error
- 出现了足够严重的问题,大多数应用程序应该崩溃而不是尝试处理问题,- 未经检查的异常 (aka
RuntimeException
) - 经常是编程错误,例如一个NullPointerException
或一个非法参数。应用程序有时可以处理或从这个Throwable
类别中恢复——或者至少在 Thread 的run()
方法中捕获它,记录投诉并继续运行。 - Checked Exception (aka Everything else) - 应用程序应该能够捕获并有意义地对其余部分做一些事情,例如
FileNotFoundException
和TimeoutException
......
这张幻灯片由@georgios-gousios展示了 Java 的异常层次结构,简明地解释了 Java 中的错误和异常之间的区别。
如您所知,错误往往表明您的应用程序结束。它通常无法从中恢复,并且应该会导致您的 VM 退出。除了可能在退出之前记录或显示和适当的消息外,不应捕获它们。
示例:OutOfMemoryError - 您无能为力,因为您的程序无法再运行。
异常通常是可恢复的,即使不是,它们通常只是意味着尝试的操作失败,但您的程序仍然可以继续。
示例:IllegalArgumentException - 将无效数据传递给方法,导致方法调用失败,但不影响以后的操作。
这些都是简单的例子,还有关于仅例外的其他丰富信息。
错误-
Error
java 中的 s 属于java.lang.Error
.- java中的所有错误都是未经检查的类型。
Error
s 发生在运行时。编译器不会知道它们。- 从错误中恢复是不可能的。
Error
s主要是由应用程序运行的环境引起的。- 例子:
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
例外-
Exception
java 中的 s 属于java.lang.Exception
.Exception
s 包括已检查和未检查的类型。- 编译器知道已检查的异常,而编译器不知道未检查的异常,因为它们发生在运行时。
- 您可以通过
try-catch
块处理异常来从异常中恢复。 Exception
s主要是应用程序本身造成的。- 示例:已检查的异常:
SQLException
、IOException
未检查的异常:ArrayIndexOutOfBoundException
、、ClassCastException
NullPointerException
进一步阅读:http: //javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
孙说得最好:
Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。
类的描述Error
很清楚:
An
Error
是它的子类,Throwable
它指示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。该ThreadDeath
错误虽然是“正常”情况,但也是 的子类,Error
因为大多数应用程序不应尝试捕获它。方法不需要在其 throws 子句中声明在
Error
方法执行期间可能抛出但未被捕获的任何子类,因为这些错误是不应该发生的异常情况。
引用自 Java 自己的类文档Error
。
简而言之,你不应该抓住Error
s,除非你有充分的理由这样做。(例如,如果 servlet 内存不足或类似情况,防止 Web 服务器的实现崩溃。)
Exception
另一方面,与任何其他现代语言一样,An只是一个正常的例外。您可以在 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 错误是可能导致您的应用程序失败且不应处理的错误。异常是可能导致不可预知的结果,但可以从中恢复的东西。
例子:
如果程序内存不足,这是一个错误,因为应用程序无法继续。但是,如果程序接受了不正确的输入类型,则这是一个异常,因为程序可以处理它并重定向以接收正确的输入类型。
错误主要是由应用程序运行的环境引起的。例如,当 JVM 内存不足时会发生 OutOfMemoryError,或者堆栈溢出时会发生 StackOverflowError。
异常主要是由应用程序本身引起的。例如,当应用程序尝试访问空对象时会发生 NullPointerException,或者当应用程序尝试强制转换不兼容的类类型时会发生 ClassCastException。
资料来源:Java中错误与异常之间的区别
这是 Java API 的一个很好的总结,错误和异常代表什么:
Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应该尝试捕获它。
方法不需要在其 throws 子句中声明任何可能在方法执行期间抛出但未被捕获的 Error 子类,因为这些错误是不应该发生的异常情况。
OTOH,对于异常,Java API 说:
类 Exception 及其子类是 Throwable 的一种形式,它指示合理的应用程序可能想要捕获的条件。
错误是由您的应用程序或程序运行的环境引起的。大多数情况下,您可能无法从中恢复,因为这会结束您的应用程序或程序。Javadoc 建议您不要费心去捕捉此类错误,因为 JVM 等环境无论如何都会退出此类错误。
示例:
VirtualMachineError
- 抛出表明 Java 虚拟机已损坏或已用完继续运行所需的资源。
OutOfMemoryError
当 JVM 内存不足或
StackOverflowError
堆栈溢出时发生。
异常是由您的应用程序或程序本身引起的;也许是因为你自己的错误。大多数情况下,您可以从中恢复,并且您的应用程序仍将继续运行。建议您捕获此类错误以防止应用程序或程序异常终止和/或能够自定义异常消息,以便用户看到格式良好的消息,而不是散布在各处的默认丑陋异常消息。
示例:
NullPointerException
当应用程序尝试访问空对象时发生。或尝试访问具有不存在索引的数组或调用具有错误数据或参数的函数。