这是一道面试题。未经检查的异常和错误之间的主要区别是什么,因为两者都没有被捕获?他们将终止程序。
8 回答
如其名称所述,未经检查的异常在编译时不检查,这意味着编译器不需要方法来捕获或指定(使用 a throws
)它们。属于此类别的类在第11.2 节JLS异常的编译时检查中进行了详细说明:
未经检查的异常类是类
RuntimeException
及其子类,以及类Error
及其子类。所有其他异常类都是检查异常类。Java API 定义了许多异常类,包括选中的和未选中的。程序员可以声明额外的异常类,包括已检查和未检查的。有关异常类层次结构和 Java API 和 Java 虚拟机定义的一些异常类的描述,请参见§11.5 。
下图说明了异常层次结构:
类Error
及其子类是普通程序通常不会从中恢复的异常,如 11.5 异常层次结构中所述:
该类
Error
是 的单独子类Throwable
,Exception
与类层次结构不同,以允许程序使用成语:} catch (Exception e) {
捕获所有可能从中恢复的异常,而不捕获通常不可能从中恢复的错误。
总而言之,RuntimeException
是未检查异常的子集,用于可以从中恢复的异常(但未检查异常不是RuntimeException
这里回答的许多人的同义词)。
JavaDocs 很好地总结了这些。
RuntimeException 是可以在 Java 虚拟机正常运行期间抛出的那些异常的超类。
方法不需要在其 throws 子句中声明任何可能在方法执行期间抛出但未被捕获的 RuntimeException 子类。
Error 是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应该尝试捕获它。
方法不需要在其 throws 子句中声明任何可能在方法执行期间抛出但未被捕获的 Error 子类,因为这些错误是不应该发生的异常情况。
请注意,“未经检查的异常”只是 a 的同义词RuntimeException
。
注意:RuntimeException 是未经检查的异常
未经检查的异常是已知在执行过程中可能发生但未被捕获的异常,例如,如果您不检查它们,NullPointerException 总是有可能发生并且会导致您的程序终止。您可以通过在 try-catch 中包装代码来检查它,但这不是强制的(与强制以某种方式处理异常的检查异常不同)。
错误是在执行期间的任何时候都可能发生的事情,并且无法真正被捕获,因为它不是由特定方法调用等引起的。例如 OutOfMemoryError 或 StackOverflowError。这两种情况都可能随时发生,并会导致您的应用程序终止。捕捉这些错误是没有意义的,因为它们表明发生了一些您将无法恢复的事情。
检查异常:
- 扩展
Throwable
类 exceptRuntimeException
的类Error
称为检查异常。 - 也称为编译时异常,因为这些类型的异常是在编译时检查的。这意味着如果我们忽略这些异常(未处理
try/catch
或throw
异常),则会发生编译错误。 - 它们是由代码无法控制的意外情况(例如数据库关闭、文件 I/O 错误、错误输入等)引起的可通过编程恢复的问题
- 我们可以使用
try/catch
块来避免它们。 - 示例 :
IOException
等SQLException
未经检查的异常:
- 扩展的类
RuntimeException
称为未经检查的异常 - 未经检查的异常不在编译时检查,而是在运行时检查。这就是为什么它们也被称为“运行时异常”
- 它们也是可通过编程方式恢复的问题,但与检查异常不同,它们是由代码流或配置中的错误引起的。
- 示例 :
ArithmeticException
,NullPointerException
等ArrayIndexOutOfBoundsException
- 由于它们是编程错误,因此可以通过巧妙/明智地编码来避免它们。例如出现“除以零”
ArithmeticEceeption
。我们可以通过一个简单的 if 条件来避免它们 -if(divisor!=0)
。同样,我们可以NullPointerException
通过简单地检查参考资料来避免 -if(object!=null)
或者使用更好的技术
错误:
Error
指 try/catch 未处理的不可恢复的情况- 示例:
OutOfMemoryError
,VirtualMachineError
等AssertionError
。
错误表明不应该发生的基本问题。如果你遇到错误…… 真的很糟糕。
另一方面,当可能以某种方式预期异常但没有合理的方法来处理它时,就会使用未经检查的异常(运行时异常),因此 try catch 语句只会令人讨厌并且浪费空间。
RuntimeExceptions
OutOfMemoryError
并且不需要捕获诸如此类的错误,并且可以将其抛出,直到它们到达将终止应用程序的 main() 。
如果其他异常没有被捕获或包含在抛出列表中,则会导致编译错误。
错误和运行时异常统称为未经检查的异常。
运行时异常是应用程序内部的异常情况,应用程序通常无法预期或从中恢复。这些通常表示编程错误,例如逻辑错误或 API 使用不当
您可能想查看解释三种例外情况的此链接。
http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html
我希望这有帮助。