从技术上讲,“不可恢复的错误”和“可恢复的错误”之间并没有真正的区别,而是在已检查的异常和未经检查的异常之间. Java确实将它们区分如下:
>您必须在throws子句中声明已检查的异常;如果使用在try块中抛出已检查异常的方法,则必须捕获所述异常或将此异常添加到方法的throws子句中;
>您可以在throws子句中声明一个未经检查的异常(不推荐);如果使用在try块中抛出未经检查的异常的方法,则可能会捕获该异常或将此异常添加到方法的throws子句中(不推荐使用).
除非你真的知道你在做什么,否则肯定不推荐的是“吞下”任何类型的未经检查的异常(即用空块捕获它).
异常是基础检查异常类; Error和RuntimeException都是未经检查的异常,所有子类都是如此.您将注意到所有三个类都扩展了Throwable,而Throwable的javadoc指出:
For the purposes of compile-time checking of exceptions, Throwable and
any subclass of Throwable that is not also a subclass of either
RuntimeException or Error are regarded as checked exceptions.
(in)着名的未经检查的例外的经典例子:
> OutOfMemoryError(扩展错误);
> StackOverflowError(扩展错误);
> NullPointerException(扩展RuntimeException);
> IllegalArgumentException(extends RuntimeException);
>等等
Error和RuntimeException之间唯一真正的区别是它们的估计严重性级别,并且是“语义”差异,而不是技术差异:最终,两者的行为相同.如果您发现错误但不重新抛出错误,某些IDE(Intellij IDEA会浮现在脑海中)也会对您大喊大叫.