代码之家  ›  专栏  ›  技术社区  ›  GuruKulki

Java中错误与未检查异常的区别?

  •  10
  • GuruKulki  · 技术社区  · 15 年前

    正如我们所知道的,如果发生任何错误或任何未检查的异常,那么我们的程序将停止,那么它们之间的区别是什么?

    7 回复  |  直到 7 年前
        1
  •  13
  •   justkt    15 年前

    Error Javadoc:

    错误是可丢弃的子类。 这表明严重的问题 合理应用不应尝试 抓住。大多数这样的错误是 异常情况。线程死亡 尽管是“正常”状态,但错误是 也是错误的一个子类,因为 应用程序不应尝试捕获 它。

    相对于 Exception 贾瓦多克

    类异常及其子类 是一种表示 条件是 应用程序可能需要捕获。

    因此,即使不需要捕获未选中的异常,您也可能希望捕获。一个错误,你不想抓住。

        2
  •  13
  •   Eric Eijkelenboom    15 年前

    简而言之:

    您可以并且可能应该从异常中恢复。

    你可以, 但不应该 ,从错误中恢复。

        3
  •  2
  •   Community CDub    7 年前

    未选中的异常:

    • 扩展的类 RuntimeException 称为未选中的异常
    • 未选中的异常不会在编译时检查,而是在运行时检查。这就是为什么它们也被调用的原因。 “运行时异常”
    • 它们也是程序上可恢复的问题,但不同于 已检查异常 它们是由代码流或配置中的错误引起的。
    • 例子: ArithmeticException , NullPointerException , ArrayIndexOutOfBoundsException
    • 因为它们是编程错误,所以可以通过良好/明智的编码来避免它们。例如,“除以零”发生 ArithmeticEceeption . 我们可以通过一个简单的if条件来避免它们- if(divisor!=0) . 同样,我们可以避免 空指针异常 只需检查参考文件- if(object!=null) 甚至使用 better techniques

    错误:

    • Error 指Try/Catch未处理的无法恢复的情况
    • 例子: OutOfMemoryError , VirtualMachineError , AssertionError 等。

      在这种情况下,这个问题可能也很有帮助。- Runtime/Checked/Unchecked/Error-Exception

        4
  •  1
  •   Bozhidar Batsov    15 年前

    正如检查异常对信令有用,当您的方法无法履行其合同时,在控制之外的其他错误可能会发生,从而阻止Java虚拟机实现其规范,例如内存耗尽时。由于您不能提前计划此类错误,因此必须在任何地方都捕获它们,这违反了维护整洁代码的原则。因此,这些错误是未选中的异常,这意味着不必在throw子句中包含异常。欢迎您捕获它们(好吧,其中一些),但编译器不会让您这样做。 未选中的异常分为两类:扩展RuntimeException的异常和扩展错误的异常。我认识到我之前说过,从类异常继承的类是检查异常,但这只是半正确的:整个事实是,异常层次结构中的类(而不是RuntimeException子层次结构中的类)是检查异常。

    扩展RuntimeException的异常表示您可能希望处理的错误,尽管您不需要这样做。

    如上所述,不会检查RuntimeExceptions,因为让您宣传它们不会影响方法的正确性,并且会不必要地使您原本可读性很强的代码混乱。另一方面,从错误类派生的异常是未选中的,因为您永远不想捕获它们!错误异常是需要关闭虚拟机的严重错误。上面我使用的internalError扩展了一个错误子类virtualmachinerror。OutofMemoryError是另一个明显的严重错误,但也有其他错误,如StackOverflowError和各种链接错误。链接错误意味着当类加载器试图加载类以执行时,出现了一些错误,并且通常是因为某些外部源已经引入恶意代码以试图绕过Java的安全机制,或者它来自一个不规范的字节代码生成器。

        5
  •  1
  •   Avi    15 年前

    来自JavaDoc:

    错误是可丢弃的子类,表示合理的应用程序不应尝试捕获的严重问题。

    RunTimeExtExchange是Java虚拟机正常运行期间可以抛出的那些异常的超类。

    所以,技术上唯一的区别是他们是两个不同的阶级。只有当你申报的时候你才能同时得到

    catch (Throwable e) { }
    

    但它们的用途有很大的不同。未选中的例外( RuntimeExceptions )旨在处理编程错误和其他意外问题,但 应该 在应用程序中捕获和处理。错误旨在表示程序无法处理的问题,例如内存不足。

        6
  •  1
  •   Mukeshkoshym    12 年前

    Java中错误与未检查异常的区别?

    未选中的异常=类RuntimeException及其子类+类错误及其子类

    因此,错误是未选中异常的一部分。未选中的异常还包含RuntimeException及其子类。

        7
  •  1
  •   Santiago Ruiz    8 年前

    术语“合理”是相对的。同样,术语“应用”

    作为中间件开发人员,我习惯于处理应用程序开发人员抛出或忽略的未检查异常。

    应用程序捕获的合理内容是其底层基础设施(即,本身是一种应用程序)捕获的合理内容的子集。

    这就是未检查的异常与错误不同的地方。未选中的可以被基础结构捕获(即在.database中注册),但被应用程序忽略。

    注册一个错误可能是不可能的,因为可能没有任何JVM来运行注册代码(甚至是捕获代码),所以捕获它们是不合理的。

    除此之外,选中的异常被过度使用。捕获它们以提升为运行时异常太常见了