我们知道如果发生任何错误或任何未经检查的异常,我们的程序将停止,那么它们之间有什么区别?
答案 0 :(得分:13)
来自Error Javadoc:
错误是Throwable的子类 这表明存在严重的问题 合理的申请不应该尝试 去抓。大多数此类错误都是 异常情况。 ThreadDeath 错误,虽然是“正常”的条件,但是 也是一个Error的子类,因为大多数 应用程序不应该尝试捕获 它
与Exception Javadoc
对比类Exception及其子类 是一种Throwable表示的形式 条件是合理的 应用程序可能想要捕获。
因此,即使不需要捕获未经检查的异常,您也可以这样做。一个错误,你不想抓住。
答案 1 :(得分:13)
简而言之:
您可以并且可能应该从异常中恢复。
您可以但不应从错误中恢复。
答案 2 :(得分:2)
未选中的例外:
RuntimeException
的类称为未经检查的例外ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
等ArithmeticEceeption
。我们可以通过一个简单的if条件来避免它们 - if(divisor!=0)
。同样,我们可以通过简单地检查引用来避免NullPointerException
- if(object!=null)
或使用偶数better techniques 错误:
Error
指的是未被try / catch 示例: OutOfMemoryError
,VirtualMachineError
,AssertionError
等。
此问题在此背景下也可能有所帮助 - 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过度使用。抓住它们以促进运行时异常是非常常见的