java中的错误和未经检查的异常之间的区别?

时间:2010-04-22 18:18:06

标签: java oop exception

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

7 个答案:

答案 0 :(得分:13)

来自Error Javadoc:

  

错误是Throwable的子类   这表明存在严重的问题   合理的申请不应该尝试   去抓。大多数此类错误都是   异常情况。 ThreadDeath   错误,虽然是“正常”的条件,但是   也是一个Error的子类,因为大多数   应用程序不应该尝试捕获   它

Exception Javadoc

对比
  

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

因此,即使不需要捕获未经检查的异常,您也可以这样做。一个错误,你不想抓住。

答案 1 :(得分:13)

简而言之:

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

您可以但不应从错误中恢复。

答案 2 :(得分:2)

未选中的例外:

  • 扩展RuntimeException的类称为未经检查的例外
  • 在编译时不检查未经检查的异常,而不是在运行时检查它们。这就是为什么它们也被称为"运行时异常"
  • 它们也是可编程恢复的问题,但与已检查的异常不同,它们是由代码流或配置中的错误引起的。
  • 示例: ArithmeticExceptionNullPointerExceptionArrayIndexOutOfBoundsException
  • 由于它们是编程错误,因此可以通过良好/明智的编码来避免它们。例如"除以零"发生ArithmeticEceeption。我们可以通过一个简单的if条件来避免它们 - if(divisor!=0)。同样,我们可以通过简单地检查引用来避免NullPointerException - if(object!=null)或使用偶数better techniques

错误:

  • Error指的是未被try / catch
  • 处理的无法恢复的情况
  • 示例: OutOfMemoryErrorVirtualMachineErrorAssertionError等。

    此问题在此背景下也可能有所帮助 - Runtime/Checked/Unchecked/Error-Exception

答案 3 :(得分:1)

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

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

正如我上面所说的那样,不会检查RuntimeExceptions,因为让你宣传它们对于确定方法的正确性没有任何影响,并且会不必要地混乱你那些非常易读的代码。另一方面,从Error类派生的异常是未选中的,因为你永远不想捕获它们!错误异常是需要关闭虚拟机的严重错误。我在上面使用的InternalError扩展了VirtualMachineError,它是一个Error子类。 OutOfMemoryError是另一个明显严重的错误,但还有其他错误,如StackOverflowError和各种LinkageErrors。链接错误意味着当类加载器试图加载一个类来执行时出现问题,并且通常是因为某些外部源引入了恶意代码以试图绕过Java的安全机制,或者它来自于spec字节码生成器。

答案 4 :(得分:1)

来自JavaDoc:

  

错误是Throwable的子类,表示合理的应用程序不应该试图捕获的严重问题。

     

RuntimeException是在Java虚拟机的正常操作期间可以抛出的那些异常的超类。

因此,技术上唯一的区别是它们是两个不同的类。如果您声明

,您将只捕获两者
catch (Throwable e) { }

但是它们的使用方式存在很大差异。未经检查的异常(RuntimeExceptions)旨在处理编程错误和其他意外问题,但在应用程序中捕获和处理。错误旨在表示程序无法处理的问题,例如内存不足。

答案 5 :(得分:1)

java中错误和未经检查的异常之间的区别?

未经检查的异常=类RuntimeException及其子类+类Error及其子类

此外,错误是未经检查的异常的一部分。未经检查的异常还包含RuntimeException及其子类。

答案 6 :(得分:1)

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

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

应用程序捕获的合理内容是其底层基础架构(即本身,一种应用程序)可以捕获的合理内容的一部分

这是未经检查的异常与错误不同的地方。未经检查可以被基础设施捕获(即在数据库中注册)但被应用程序忽略

注册错误是不可能的,因为可能没有JVM来运行注册代码(甚至是捕获代码),这就是为什么捕获它们是不合理的

顺便说一句,检查过的例外情况是IMHO过度使用。抓住它们以促进运行时异常是非常常见的