【问题标题】:Differences between Exception and Error异常与错误的区别
【发布时间】:2010-10-29 01:55:11
【问题描述】:

我正在尝试了解更多关于基本 Java 和不同类型的 Throwables 的信息,有人可以告诉我异常和错误之间的区别吗?

【问题讨论】:

    标签: java exception throwable


    【解决方案1】:

    错误是由您的应用程序或程序运行的环境引起的。大多数情况下,您可能无法从中恢复,因为这会结束您的应用程序或程序。 Javadoc 建议您不要费心去捕捉此类错误,因为环境例如JVM,出现此类错误无论如何都会退出。

    示例: VirtualMachineError - 抛出以表明 Java 虚拟机已损坏或已用完继续运行所需的资源。 OutOfMemoryError 发生在 JVM 内存不足或 StackOverflowError 在堆栈溢出时发生。

    异常是由您的应用程序或程序本身引起的;也许是因为你自己的错误。大多数情况下,您可以从中恢复,并且您的应用程序仍将继续运行。建议您捕获此类错误以防止应用程序或程序异常终止和/或能够自定义异常消息,以便用户看到格式良好的消息,而不是散布在各处的默认丑陋异常消息。

    示例: NullPointerException 在应用程序尝试访问空对象时发生。要么 尝试使用不存在的索引访问数组或使用错误的数据或参数调用函数。

    【讨论】:

      【解决方案2】:

      Errors -

      1. Java 中的Errors 属于java.lang.Error 类型。
      2. java 中的所有错误都是未经检查的类型。
      3. Errors 发生在运行时。编译器不会知道它们。
      4. 无法从错误中恢复。
      5. Errors 主要是由应用程序运行的环境引起的。
      6. 示例: java.lang.StackOverflowError, java.lang.OutOfMemoryError

      Exceptions -

      1. Java 中的Exceptions 属于java.lang.Exception 类型。
      2. Exceptions 包括选中和未选中类型。
      3. 编译器知道已检查的异常,而编译器不知道未经检查的异常,因为它们发生在运行时。
      4. 您可以通过try-catch 块处理异常来从异常中恢复。
      5. Exceptions 主要是应用本身造成的。
      6. 示例: 检查异常:SQLExceptionIOException
        未经检查的异常:ArrayIndexOutOfBoundExceptionClassCastExceptionNullPointerException

      进一步阅读:http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/

      【讨论】:

        【解决方案3】:

        @georgios-gousiosslide showing Java's exception hierarchy 简明地解释了 Java 中错误和异常之间的区别。

        【讨论】:

        • 我很想看到有人从 NullPointerException 中恢复过来:D:D:D
        • @IgnacioSolerGarcia 可以,甚至有道理(另一个问题是它是否好)。通常你检查对象是否存在,然后调用方法或使用字段。但是您可以尝试捕获 NPE 而不是检查是否存在。例如,记录一条关于它的消息并继续。
        • @Gangnus:没有意义。请记住,异常会跳过部分代码并且是报告错误的一种方式,而不是正常操作
        【解决方案4】:

        java.lang.Exceptionjava.lang.Error 类之间有几个相同点和不同点。

        相似之处:

        • 首先 - 两个类都扩展了 java.lang.Throwable,因此 继承了很多交易时常用的方法 出现以下错误:getMessagegetStackTraceprintStackTrace 和 以此类推。

        • 其次,作为java.lang.Throwable 的子类,它们都继承 以下属性:

          • Throwable 本身及其任何子类(包括java.lang.Error)可以使用throws 关键字在方法异常列表中声明。只有java.lang.Exception 及其子类需要这样的声明,对于java.lang.Throwablejava.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 required 声明时。

        Throwable 及其后继类图(省略了属性和方法)。

        【讨论】:

          【解决方案5】:

          错误主要是由应用程序运行的环境引起的。例如,JVM 内存不足时发生 OutOfMemoryError,堆栈溢出时发生 StackOverflowError。

          异常主要是由应用程序本身引起的。例如,当应用程序尝试访问空对象时会发生 NullPointerException,或者当应用程序尝试强制转换不兼容的类类型时会发生 ClassCastException。

          来源:Difference Between Error Vs Exception In Java

          【讨论】:

          • “错误主要是应用程序运行的环境造成的”和“异常主要是应用程序本身造成的”完美!
          【解决方案6】:

          不应捕获或处理错误(极少数情况除外)。异常是异常处理的基础。 Javadoc 解释的很好:

          错误是 Throwable 的子类,表示严重的问题 合理的应用不应该试图抓住。大多数此类错误是异常的 条件。

          看看Error 的几个子类,取他们的一些JavaDoc cmets:

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

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

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

          【讨论】:

          • Oracle 说 Unchecked exceptions != RuntimeExceptions ; Unchecked exceptions = RuntimeExceptions + Errors。我知道它提出了一个问题:错误是例外吗?,但这是他们写的。这只是其中一个示例:docs.oracle.com/javase/tutorial/essential/exceptions/…
          • 悬而未决的问题是 RuntimeException 和 Error 在本质上有何不同? 两者都是未经检查的,并且在其他方​​面都相同。
          【解决方案7】:

          如您所知,错误往往表明您的应用程序已结束。它通常无法从中恢复,并且应该会导致您的 VM 退出。除了在退出之前可能记录或显示和适当的消息外,不应捕获它们。

          示例: OutOfMemoryError - 您无能为力,因为您的程序无法再运行。

          异常通常是可恢复的,即使不能恢复,它们通常只是意味着尝试的操作失败,但您的程序仍然可以继续。

          示例: IllegalArgumentException - 将无效数据传递给方法,导致方法调用失败,但不影响以后的操作。

          这些都是简单的例子,还有更多关于异常的信息。

          【讨论】:

          【解决方案8】:

          IMO 错误是可能导致您的应用程序失败且不应处理的错误。异常是可能导致不可预知的结果,但可以从中恢复。

          例子:

          如果程序内存不足,这是一个错误,因为应用程序无法继续。但是,如果程序接受了不正确的输入类型,则这是一个异常,因为程序可以处理它并重定向以接收正确的输入类型。

          【讨论】:

            【解决方案9】:

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

            错误是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。 ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应尝试捕获它。

            方法不需要声明 它的 throws 子句的任何子类 期间可能抛出的错误 执行该方法但不执行 捕获,因为这些错误是 不应该出现的异常情况 发生。

            OTOH,对于异常,Java API 说:

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

            【讨论】:

              【解决方案10】:

              Error类的描述很清楚:

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

              方法不需要声明 它的 throws 子句的任何子类 Error 可能会在 执行该方法但不执行 捕获,因为这些错误是 不应该出现的异常情况 发生。

              引用自 Java 自己的documentation of the class Error

              简而言之,你不应该抓住Errors,除非你有充分的理由这样做。 (例如,如果 servlet 内存不足或类似情况,防止您的 Web 服务器实现崩溃。)

              另一方面,Exception 只是一个普通的例外,就像在任何其他现代语言中一样。您可以在 Java API 文档或任何在线或离线资源中找到详细说明。

              【讨论】:

                【解决方案11】:

                puts it best:

                错误是 Throwable 的子类 这表明严重的问题 合理的应用不应该尝试 赶上。

                【讨论】:

                  猜你喜欢
                  • 2011-02-24
                  • 2019-11-26
                  • 2022-07-15
                  • 1970-01-01
                  • 2013-04-15
                  • 2011-01-26
                  • 2011-08-14
                  • 2011-04-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多