为什么Java中存在已检查和未检查的exception
可能重复:
Java:已检查vs未经检查的exception说明
为什么命名的例外被选中和取消选中?
为什么Java中的两个exception类型名为“checked”和“unchecked”? 选择此类例外的原因是什么?
RuntimeException
类及其子类以及类Error
及其子类是未经检查的exception类 。 编译器不会强制它们在throws子句中声明。 属于Throwable
层次结构的所有其他exception类都是已检查的exception。
未经检查的exception类在java中免于编译时检查,因为它们可以在程序中的许多点发生,并且很难或不可能从中恢复。 它们还取决于程序员的逻辑。 例如,当JVM无法为程序分配更多内存时, OutOfMemory Exception
已检查的exception扩展了java.lang.Exception
,而未经检查的exception扩展了java.lang.RuntimeException
或java.lang.Error
。
Exception
扩展了java.lang.Throwable
,而RuntimeException
扩展了Exception
,而Error
就像Exception
一样,扩展了java.lang.Throwable
。
在决定是否应该使用已检查与未检查的exception时,请始终记住以下规则:
-
Exception
S是应用程序想要处理的情况。 -
RuntimeException
S是您(通常)由于编程错误而无法处理的情况。 您不应该捕获RuntimeException
S,它们应该在您的unit testing中作为目标,并在您的生产代码中修复。 -
Error
S是由于严重错误而无法处理的情况,例如系统问题(例如文件系统失败)。 您不应该抛出,捕获或子类化Error
,除非您正在为JVM构建诸如编译器之类的东西。