我正在尝试更多地了解基本的 Java 和不同类型的 Throwables,有人可以让我知道异常和错误之间的区别吗?

有帮助吗?

解决方案

不应捕获或处理错误(除非在极少数情况下)。异常是异常处理的基础。这 Java文档 解释得很好:

Error 是 Throwable 的一个子类,它表示一个 合理的应用程序不应尝试捕捉。大多数此类错误都是不正常的 条件

看一下它的几个子类 Error, ,摘录他们的一些 JavaDoc 评论:

  • AnnotationFormatError - 当注释解析器尝试从类文件读取注释并确定注释格式错误时抛出。
  • AssertionError - 抛出该异常表示断言失败。
  • LinkageError - LinkageError 的子类表明一个类对另一个类有一定的依赖性;然而,在前一个类编译后,后一个类发生了不兼容的变化。
  • VirtualMachineError - 抛出该异常表示 Java 虚拟机已损坏或已耗尽继续运行所需的资源。

实际上有三个重要的子类别 Throwable:

  • Error - 出现了足够严重的问题,大多数应用程序应该崩溃而不是尝试处理问题,
  • 未经检查的异常(又名 RuntimeException) - 通常是一个编程错误,例如 NullPointerException 或非法论证。应用程序有时可以处理此问题或从中恢复 Throwable 类别——或者至少在线程中捕获它 run() 方法,记录投诉并继续运行。
  • 检查异常(又名其他所有异常)- 应用程序应能够捕获其余异常并对其进行有意义的操作,例如 FileNotFoundExceptionTimeoutException...

其他提示

滑动示出Java的异常层次通过 @ Georgios的-gousios 简明地解释用Java错误和例外之间的区别。

错误往往会因为你知道它的信号你的应用程序的结束。它通常不能恢复,应该引起你的虚拟机退出。捕捉他们不应除了显示和相应的消息退出之前可能记录或进行。

示例 的OutOfMemoryError - 没有什么可以做的是你的程序不再运行

例外往往是恢复的,即使没有,他们一般只是意味着一个尝试的操作失败了,但是你的程序仍然可以继续。

示例 抛出:IllegalArgumentException - 传递无效数据的方法,这样的方法调用失败,但它不会影响未来的行动

这些是简单的示例,并且存在对单独只是例外信息的另一财富。

说得最好:

  

的误差的Throwable的子类   表示的严重问题   合理的应用程序不应该尝试   捉。

错误 -

  1. Errorjava中的s是类型 java.lang.Error.
  2. java中的所有错误都是未经检查的类型。
  3. Error发生在运行时。编译器不会知道它们。
  4. 从错误中恢复是不可能的。
  5. Error大部分是由应用程序运行的环境引起的。
  6. 例子 : java.lang.StackOverflowError, java.lang.OutOfMemoryError

例外情况 -

  1. Exceptionjava中的s是类型 java.lang.Exception.
  2. Exception包括检查型和未检查型。
  3. 编译器已知已检查异常,而编译器不知道未检查异常,因为它们发生在运行时。
  4. 您可以通过处理异常来从异常中恢复 try-catch 块。
  5. Exception主要是应用程序本身造成的。
  6. 例子 : 检查异常: SQLException, IOException
    未经检查的异常: ArrayIndexOutOfBoundException, ClassCastException, NullPointerException

进一步阅读: http://javaconceptoftheday.com/difference- Between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

Error类的描述是很清楚的:

  

这是ErrorThrowable的子类   表示的严重问题   合理的应用程序不应该尝试   去抓。大多数这样的错误是   异常情况。该ThreadDeath   错误,虽然是“正常”的情况下,是   也Error的子类,因为大多数   应用程序不应该试图捕获   它

     

不要求的方法,在声明   其throws子句中的任何子类   Error可能在抛出   该方法的执行而不是   抓,因为这些错误   正常情况下应该永远   发生。

从Java本身的 rel="nofollow类Error的noreferrer">文档

在短,你不应该赶上Errors,除非你有一个很好的理由这样做。 (例如,以防止你的Web服务器的实现,如果一个servlet内存用完或类似的东西崩溃。)

这是Exception,另一方面,仅仅是一个正常的异常如在任何其它现代语言。你会发现在Java API文档中详细描述或任何在线或离线资源。

类之间有一些相同点和不同点 java.lang.Exceptionjava.lang.Error.

相似之处:

  • 首先 - 两个类都扩展 java.lang.Throwable 因此 继承了许多常用方法。 错误,如 getMessage, getStackTrace, printStackTrace 和 等等。

  • 其次,作为子类 java.lang.Throwable 他们都继承 具有以下特性

    • Throwable 本身及其任何子类(包括 java.lang.Error) 可以使用以下方法在方法异常列表中声明 throws 关键词。此类声明仅适用于 java.lang.Exception 和子类,对于 java.lang.Throwable, java.lang.Errorjava.lang.RuntimeException 及其子类是可选的。

    • 仅有的 java.lang.Throwable 和允许使用的子类 catch 条款。

    • 仅有的 java.lang.Throwable 子类可以与关键字一起使用 - throw.

该属性的结论遵循以下两个 java.lang.Errorjava.lang.Exception 可以在方法头中声明,可以在 catch 子句,可以与关键字一起使用 throw.

差异:

  • 首先-概念差异: java.lang.Error 旨在 由 JVM 抛出,表明存在严重问题,旨在停止 程序的执行,而不是被捕获(但也有可能,如 任何其他 java.lang.Throwable 接班人)。

    一段来自 javadoc 描述关于 java.lang.Error:

    ......表明存在严重问题,合理的申请应 不试图抓住。

    相反 java.lang.Exception 旨在表示以下错误 程序员可以处理,而无需终止 程序执行。

    一段来自 javadoc 描述关于 java.lang.Exception:

    ......表明合理的申请可能希望满足的条件 接住。

  • 第二个区别 java.lang.Errorjava.lang.Exception 首先被认为是 未经检查的 编译时异常检查的异常。作为结果代码抛出 java.lang.Error 或其子类不需要在方法头中声明此错误。投掷时 java.lang.Exception 方法头中需要声明。

Throwable 及其后继类图(属性和方法省略)。enter image description here

IMO错误的东西,可能会导致应用程序失败,不应该被处理。一个例外是东西,可以导致不可预测的结果,但可从被回收。

示例:

如果一个程序已用完的存储器是错误作为应用程序不能继续。然而,如果程序接受不正确的输入类型是一个例外,因为该程序可以处理它并重定向到接收正确的输入类型。

下面是从Java API一个很好的总结什么错误和异常代表:

  

这是错误是Throwable的子类,表示严重的问题,合理的应用程序不应该试图捕获。大多数这样的错误都是异常情况。该错误的ThreadDeath,虽然是“正常”的情况下,也是错误的子类,因为大多数应用程序不应该试图抓住它。

     

不要求的方法,在声明   其throws子句中的任何子类   这可能会在抛出错误   该方法的执行而不是   抓,因为这些错误   正常情况下应该永远   发生。

OTOH,对于异常,Java API的表示:

  

类异常及其子类是Throwable的一种形式,其指示条件合理的应用程序想要捕获的。

错误主要是由在其中运行应用程序的环境。例如,当OutOfMemoryError异常JVM运行的内存或时的StackOverflowError堆栈溢出发生发生。

异常主要是由应用程序本身。例如,空指针异常时的应用程序试图访问空对象或ClassCastException异常当应用程序试图铸造不相容类类型发生发生。

来源:误差之间差Vs异常在Java

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top