Ani*_*dha 4 java exception-handling
我们有Throwable类,它是类的基类Error(用于不可恢复的错误)和Exception类(用于可恢复的错误)
所以,
1>我们可以 throw实现一个实现error类的对象.(虽然实现类没有意义,Error因为我们有Exception类做同样的事情..)
2> Java不建议捕获Error对象..
那么Error对象的需求是什么呢?编译器不能在内部实现它吗?这不是一个错误吗?
你当然可以抛出扩展(不实现)Error类的对象.
如你所说,Error存在不可恢复的错误.最广泛的用途是在JVM本身内部,它使用Error无法从中恢复的东西的子类,并且不希望您能够从中恢复 - 例如内存不足.
从技术上讲,"不可恢复的错误"和"可恢复的错误"之间并没有真正的区别,而是在已检查的异常和未经检查的异常之间.Java 确实将它们区分如下:
throws条款中声明一个经过检查的例外; 如果使用在try块中抛出已检查异常的方法,则必须说明catch异常或将此异常添加到方法的throws子句中;throws条款中声明未经检查的例外(不推荐); 如果使用在try块中抛出未经检查的异常的方法,则可能 catch是该异常或将此异常添加到方法的throws子句中(不推荐使用).除非你真的知道你在做什么,否则肯定不推荐的是"吞下"任何类型的未经检查的异常(即,catch它带有空块).
Exception是基本检查的异常类; Error并且RuntimeException都是未经检查的异常,所有子类都是如此.您将注意到所有三个类都扩展Throwable,并且javadoc用于Throwable表示:
出于编译时检查异常的目的,Throwable和Throwable的任何子类(也不是RuntimeException或Error的子类)都被视为已检查的异常.
(in)着名的未经检查的例外的经典例子:
OutOfMemoryError(延伸Error);StackOverflowError(延伸Error);NullPointerException(延伸RuntimeException);IllegalArgumentException(延伸RuntimeException);之间的唯一真正的区别Error,并RuntimeException为他们的估计严重级别,并且是"语义"的区别,不是技术的区别:最终,双方具有相同的行为.一些IDE(Intellij IDEA浮现在脑海中)如果你抓到Error但不重新抛出它也会对你大喊大叫.
javadoc表示错误
Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题.大多数此类错误都是异常情况.
而对于Exception,javadoc说
类Exception及其子类是Throwable的一种形式,它表示合理的应用程序可能想要捕获的条件.
一些差异
这完全取决于Java中的Error和Exception之间的区别.要记住的关键点是,Error本质上是致命的,并且可能无法进行恢复,另一方面,通过仔细处理Exception,您可以使代码更加健壮并防范不同的场景.
查看一些Error的子类,取自各自的javadoc:
AnnotationFormatError - 当注释解析器尝试从类文件中读取注释并确定注释格式错误时抛出.
AssertionError - 抛出以指示断言失败.
LinkageError - LinkageError的子类表明一个类对另一个类有一些依赖性; 然而,后一类在前一类的编译后发生了不相同的变化.
VirtualMachineError - 抛出此异常表示Java虚拟机已损坏或已耗尽其继续运行所需的资源.