为什么我们需要Error类?

Ani*_*dha 4 java exception-handling

我们有Throwable类,它是类的基类Error(用于不可恢复的错误)和Exception类(用于可恢复的错误)

所以,

1>我们可以 throw实现一个实现error类的对象.(虽然实现类没有意义,Error因为我们有Exception类做同样的事情..)

2> Java不建议捕获Error对象..


那么Error对象的需求是什么呢?编译器不能在内部实现它吗?这不是一个错误吗?

dty*_*dty 7

你当然可以抛出扩展(不实现)Error类的对象.

如你所说,Error存在不可恢复的错误.最广泛的用途是在JVM本身内部,它使用Error无法从中恢复的东西的子类,并且不希望您能够从中恢复 - 例如内存不足.


fge*_*fge 7

从技术上讲,"不可恢复的错误"和"可恢复的错误"之间并没有真正的区别,而是在已检查的异常和未经检查的异常之间.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但不重新抛出它也会对你大喊大叫.


Rah*_*hul 5

javadoc表示错误

Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题.大多数此类错误都是异常情况.

而对于Exception,javadoc说

类Exception及其子类是Throwable的一种形式,它表示合理的应用程序可能想要捕获的条件.

一些差异

  1. 错误并不意味着被捕获,即使你抓住它也无法从中恢复.例如,在OutOfMemoryError期间,如果你抓住它,你将再次获得它,因为GC可能无法在第一时间释放内存.另一方面,可以正确捕获和处理异常.
  2. 错误通常是致命的,并且从错误中恢复是不可能的,这在Exception的情况下是不同的,在所有情况下都可能不是致命的.Java中错误与异常的区别
  3. 与Error不同,Exception通常分为两类,例如checked和unchecked Exceptions.Checked Exception在Java编程语言中具有特殊的地位,并且需要一个强制性的try catch finally代码块来处理它.另一方面,Unchecked Exception是RuntimeException的子类,主要表示编程错误.最常见的未经检查的异常示例是Java中的NullPointerException.
  4. 与未经检查的异常类似,Java中的错误也未被选中.如果编译器没有看到使用try catch或finally块处理的错误,则不会抛出编译时错误.事实上,处理错误不是一个好主意,因为从错误中恢复是不可能的.

这完全取决于Java中的Error和Exception之间的区别.要记住的关键点是,Error本质上是致命的,并且可能无法进行恢复,另一方面,通过仔细处理Exception,您可以使代码更加健壮并防范不同的场景.

查看一些Error的子类,取自各自的javadoc:

AnnotationFormatError - 当注释解析器尝试从类文件中读取注释并确定注释格式错误时抛出.

AssertionError - 抛出以指示断言失败.

LinkageError - LinkageError的子类表明一个类对另一个类有一些依赖性; 然而,后一类在前一类的编译后发生了不相同的变化.

VirtualMachineError - 抛出此异常表示Java虚拟机已损坏或已耗尽其继续运行所需的资源.