关于Java.lang.Error的问题

关于Java.lang.Error的问题,java,exception,throwable,Java,Exception,Throwable,在java.lang.Error上有很多帖子说它不应该被捕获。我的问题是,如果不使用它,它有什么用呢。因为它是可以扔掉的,所以我们可以试着抓住它。我读了一些帖子,比如只有在某些情况下才应该被抓到,如何知道这些情况 简言之,我想知道当我发现错误时会出现什么问题。它背后的过程是什么。他们为什么会犯错误及其子类?如果我的应用程序不应该捕获它们,那么什么会捕获它们?为什么我的代码不能处理这个捕获到的错误?如果我只是捕获一个错误并在catch块中编写一些处理代码,那么该代码不会运行吗?这里已经回答了类似的

java.lang.Error
上有很多帖子说它不应该被捕获。我的问题是,如果不使用它,它有什么用呢。因为它是可以扔掉的,所以我们可以试着抓住它。我读了一些帖子,比如只有在某些情况下才应该被抓到,如何知道这些情况


简言之,我想知道当我发现错误时会出现什么问题。它背后的过程是什么。他们为什么会犯错误及其子类?如果我的应用程序不应该捕获它们,那么什么会捕获它们?为什么我的代码不能处理这个捕获到的错误?如果我只是捕获一个错误并在catch块中编写一些处理代码,那么该代码不会运行吗?

这里已经回答了类似的问题-

基本上,您永远不应该试图捕获它,因为它在相当严重的问题上抛出,例如当您的线程由于某种原因已死亡且无法恢复时。 但是,在处理上述URL中所述的框架本身时,有时需要捕获错误。

错误(尤其是VirtualMachineError的子类)表示JVM遇到了内部问题,这意味着其内部状态可能不再一致。如果捕捉到错误并尝试恢复,则未来的行为未定义。错误可以丢弃的原因是它们可以被抛出——例如,您可以自己处理无法恢复的本机库中的错误(例如库可能已写入JVM内存,或者损坏了其内部静态)。同样的堆垛行走和堆垛跟踪生产机械也用于所有的一次性垃圾——如果有另一种机械来做同样的事情,那将是愚蠢的

JVM中不是虚拟机错误的大多数错误都是本机库可能破坏其静态状态的情况,例如AWTError、ziperor

然而,在一些罕见的情况下,捕捉错误是正常的:测试框架中的AssertionError和LinkageError,在这些情况下,您必须在运行时处理库的不同版本的缺失/存在。这是一个非常罕见的需求,可以通过反射更好地处理

所有规则都有例外(除此之外)

即使每个人都说不应该这样做,但在很多情况下,捕获那些java.lang.Error是完全合适的。规则背后的逻辑是:“在检测到致命情况后,不要尝试继续运行应用程序”。因此,在抛出此类错误后,在执行某些操作之前,您必须小心。之后,系统可能无法继续其任务

servlet可以捕获OutOfMemoryError,记录错误并销毁会话。也许问题出在那次精确的治疗上。销毁它将恢复内存,并允许其他用户继续使用该系统。但是,您应该有一种机制来实时跟踪这些错误,以便:

  • 修复编程错误 (断言错误,堆栈溢出错误)
  • 修复配置错误 (不满意链接错误)
  • 正确的JVM大小调整参数(OutOfMemoryError)
  • 这种处理应该在执行主循环(或等效循环)的调用堆栈中非常“高”的位置进行(即在main()附近)。我认为在深层代码中捕获错误不是一个好的做法,在这些情况下,您至少应该重新显示错误