我正在尝试更多地了解基本Java和不同类型的Throwables,有人能告诉我异常和错误之间的区别吗?
答案 0 :(得分:160)
不应发现或处理错误(除了最罕见的情况)。例外是异常处理的基础。 Javadoc解释得很好:
错误是Throwable的一个子类,表示a的严重问题 合理的应用不应该试图抓住。大多数此类错误都是异常的 条件。
查看Error
的一些子类,获取他们的一些JavaDoc注释:
AnnotationFormatError
- 当注释解析器尝试从类文件中读取注释并确定注释格式错误时抛出。AssertionError
- 抛出表示断言失败。LinkageError
- LinkageError的子类表明一个类对另一个类有一些依赖性;然而,后一类在前一类的编译后发生了不相同的变化。 VirtualMachineError
- 抛出此异常表示Java虚拟机已损坏或已耗尽其继续运行所需的资源。 Throwable
确实有三个重要的子类别:
Error
- 大多数应用程序出现问题都应该崩溃,而不是试图解决问题,RuntimeException
) - 通常是编程错误,例如NullPointerException
或非法参数。应用程序有时可以处理或从此Throwable
类别中恢复 - 或至少通过线程的run()
方法捕获它,记录投诉并继续运行。FileNotFoundException
和TimeoutException
... 答案 1 :(得分:28)
slide showing Java's exception hierarchy @georgios-gousios简要解释了Java中的错误和异常之间的差异。
答案 2 :(得分:17)
如您所知,错误往往表示您的应用程序已结束。它通常无法从中恢复,并且应该导致VM退出。除非在退出之前可能记录或显示相应的消息,否则不应该捕获它们。
示例 OutOfMemoryError - 由于您的程序无法再运行,因此您无能为力。
异常通常是可以恢复的,即使不是,它们通常只是意味着尝试的操作失败,但您的程序仍然可以继续。
示例 IllegalArgumentException - 将无效数据传递给方法,以便方法调用失败,但不会影响将来的操作。
这些都是简单的例子,仅有例外情况就有另外丰富的信息。
答案 3 :(得分:7)
Sun puts it best:
错误是Throwable的子类 这表明存在严重的问题 合理的申请不应该尝试 赶上。
答案 4 :(得分:5)
Errors -
Error
类型为java.lang.Error
。 Error
在运行时发生。编译器不会知道它们。 Error
主要是由运行应用程序的环境引起的。 java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exception
的类型为java.lang.Exception
。Exception
包括已选中和未选中的类型。try-catch
块处理异常来恢复异常。Exception
主要由应用程序本身引起。SQLException
,IOException
ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
进一步阅读:http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
答案 5 :(得分:3)
Error
类的描述非常明确:
Error
是Throwable
的子类 这表明存在严重的问题 合理的申请不应该尝试 去抓。大多数此类错误都是 异常情况。ThreadDeath
错误,虽然是“正常”的条件,但是 也是Error
的子类,因为大多数 应用程序不应该尝试捕获 它声明输入不需要方法 它的throws子句的任何子类 可能在此期间被抛出的
Error
执行方法但不是 抓住了,因为这些错误是 不应该的异常情况 发生。
引自Java自己的documentation of the class Error
。
简而言之,你不应该抓住Error
,除非你有充分的理由这样做。 (例如,如果servlet内存不足或类似内容,请防止Web服务器的实现崩溃。)
Exception
只是一个普通的例外,就像在任何其他现代语言中一样。您可以在Java API文档或任何在线或离线资源中找到详细说明。
答案 6 :(得分:2)
班级java.lang.Exception
和java.lang.Error
之间存在一些相同点和不同点。
<强>相似点:强>
首先 - 两个类都扩展java.lang.Throwable
,因此
继承了许多在交易时常用的方法
有以下错误:getMessage
,getStackTrace
,printStackTrace
和
等等。
其次,作为java.lang.Throwable
的子类,它们都继承
以下属性:
可以使用java.lang.Error
关键字在方法例外列表中声明Throwable本身及其任何子类(包括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
继任者)。
关于java.lang.Error
的{{3}}描述的段落:
...表示合理应用应该出现的严重问题 不要试图抓住。
用于表示错误的对面java.lang.Exception
预期并且可以由程序员处理而不会终止
程序执行。
关于java.lang.Exception
的{{3}}描述的段落:
...表示合理的应用程序可能想要的条件 捉。
java.lang.Error
和java.lang.Exception
之间的第二个区别,它首先被认为是编译时异常检查的未经检查的异常。结果代码抛出java.lang.Error
或其子类不需要在方法头中声明此错误。在方法标题中抛出java.lang.Exception
必需的声明。Throwable及其后继类图(省略了属性和方法)。 javadoc
答案 7 :(得分:1)
IMO错误是导致应用程序失败并且不应该处理的错误。异常会导致不可预测的结果,但可以从中恢复。
示例:
如果程序内存不足,则会出错,因为应用程序无法继续运行。但是,如果程序接受不正确的输入类型,则它是一个例外,因为程序可以处理它并重定向以接收正确的输入类型。
答案 8 :(得分:0)
以下是Java API的一个很好的总结,错误和异常代表了什么:
错误是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题。大多数此类错误都是异常情况。 ThreadDeath错误虽然是“正常”条件,但也是Error的子类,因为大多数应用程序都不应该尝试捕获它。
声明输入不需要方法 它的throws子句的任何子类 在期间可能抛出的错误 执行方法但不是 抓住了,因为这些错误是 不应该的异常情况 发生。
OTOH,对于Exceptions,Java API说:
类Exception及其子类是Throwable的一种形式,它表示合理的应用程序可能想要捕获的条件。
答案 9 :(得分:0)
错误主要是由运行应用程序的环境引起的。例如,当JVM内存不足时发生OutOfMemoryError,或者当堆栈溢出时发生StackOverflowError。
例外主要是由应用程序本身引起的。例如,当应用程序尝试访问null对象时发生NullPointerException,或者当应用程序尝试转换不兼容的类类型时发生ClassCastException。
答案 10 :(得分:0)
错误是由运行应用程序或程序的环境引起的。大多数情况下,您可能无法从中恢复,因为这会终止您的应用程序或程序。 Javadoc建议您不要因为环境等原因而麻烦捕获此类错误。 JVM,无论如何都会退出此类错误。
示例:
VirtualMachineError
-抛出该错误消息表明Java虚拟机已损坏或已经用尽了继续运行所必需的资源。
当JVM的内存不足或发生OutOfMemoryError
时
堆栈溢出时发生StackOverflowError
。
异常是由您的应用程序或程序本身引起的;可能是由于您自己的错误。大多数情况下,您可以从中恢复,并且应用程序仍将继续运行。建议您捕获此类错误,以防止应用程序或程序异常终止和/或能够自定义异常消息,以便用户看到格式正确的消息,而不是到处散布的默认丑陋异常消息。>
示例:
当应用程序尝试访问空对象时发生NullPointerException
。要么
尝试访问不存在的索引数组或使用错误的数据或参数调用函数。