Java异步异常:我可以捕获它们吗?

Java异步异常:我可以捕获它们吗?,java,exception,virtual-machine,Java,Exception,Virtual Machine,我一直在阅读JLS,遇到了我引用的部分: 大多数异常都是由于 它们发生的线程,并且在程序中 指定为可能导致此类异常。异步的 相反,异常是一种可能在特定时间发生的异常 程序执行中的任何一点 及 异步异常仅在以下情况下发生: [……] Java虚拟机中的内部错误或资源限制,阻止它实现 Java编程语言。在本例中,异步异常 抛出的是VirtualMachineError子类的一个实例 是否有可能捕获此类异常以用于日志记录或通知(因为我认为这样的事情是不可恢复的)?如何实现这样的目标?您可以像捕获任

我一直在阅读JLS,遇到了我引用的部分:

大多数异常都是由于 它们发生的线程,并且在程序中 指定为可能导致此类异常。异步的 相反,异常是一种可能在特定时间发生的异常 程序执行中的任何一点

异步异常仅在以下情况下发生:

[……]

  • Java虚拟机中的内部错误或资源限制,阻止它实现 Java编程语言。在本例中,异步异常 抛出的是VirtualMachineError子类的一个实例

是否有可能捕获此类异常以用于日志记录或通知(因为我认为这样的事情是不可恢复的)?如何实现这样的目标?

您可以像捕获任何其他异常一样捕获此类异常。唯一的问题是它们可能发生在程序中的任何位置,因此很难可靠地捕获它们。基本上,您必须将所有线程的
run
方法和
main
方法包装在
try..catch
块中,但对于您无法控制的线程(如Swing EDT或计时器线程等),您不能这样做

另外,通常不建议捕获
Error
的任何子类,因为JVM可能处于不稳定状态,这可能会导致进一步的故障(例如在
OutOfMemoryError
的情况下,您甚至可能没有足够的内存来处理异常)。然而,在我看来,日志记录是捕捉
错误的一个有效理由


我建议的解决方案是使用一个。在这个处理程序中,如果没有在代码中的任何地方捕获到所有异常和错误,您将获得它们,您可以尝试记录它们。

捕获这些异常(VirtualMachineError的子类)没有任何意义,因为您不知道pogram处于什么状态,文档会说关于虚拟机错误:

Java虚拟机实现抛出的对象是 当 内部错误或资源限制使其无法实现 本章描述的语义此规范不适用 预测可能出现的内部错误或资源限制 遇到的问题,并且没有明确规定何时可以报告这些问题


因此,假设您遇到OutOfMemory错误或未知错误,您对此无能为力,并且一旦您的VritualShine无法正常工作,您就无法向用户提供任何帮助,因为您的程序也无法正常工作,而且您不知道在什么时间、点,它发生的原因是因为它不是由您的程序引起的代码错误。

如果想知道
try-catch
块是否可以在
try
块中,是的,您可以拥有它@当然,
try..catch
可以出现在普通语句可能出现的任何地方,这包括嵌套的
try
。当然,您也可以在另一个
catch
内放置
try..catch
。我不明白添加
try..catch
块如何帮助捕获此类异常。我有这样一个案例,添加“内部”
try--catch
对我的案例没有帮助。你能详细说明一下吗@Prasanth@Philipp Wendler?@MichaelTrouw在本例中,异常可能是在线程不在try块内时抛出的。@PhilippWendler我刚刚发现调试时发生了什么。捕获从未执行,因为异常是在较低的(库)级别处理的。我把它们扔掉了,所以它们像预期的那样冒了出来,而且看起来这并不是一个异步任务。Java初学者的好提示,异常102:检查您期望的异常是否真的被抛出!