为了账号安全,请及时绑定邮箱和手机立即绑定

无掷VirtualMachineError保证

/ 猿问

无掷VirtualMachineError保证

宝慕林4294392 2019-10-21 15:45:26

我来自C ++。在C ++世界中,我们关注异常安全性,并注意,面对mutator本身或其委托的方法(最小,强,无抛出)引发的异常,mutator可以提供不同的保证。实现具有强大异常保证的方法要求保证某些基本操作永远不会引发异常。JLS做出有关哪些操作可以引发哪些异常的语句,但是VirtualMachineError错误提出了一个问题。捷豹路虎:


内部错误或资源限制阻止Java虚拟机实现Java编程语言的语义;在这种情况下,将VirtualMachineError抛出的子类的实例 。


联合国解放军再也没有说过有关VirtualMachineError。“内部错误”表示JVM中的错误,因此我对这种情况不感兴趣:面对JVM中的错误,所有赌注都没有了。但是“资源限制”案例呢?是否有任何保证不会因资源限制而失败的操作?


查看完整描述

3 回答

?
MYYA

答曰Java虚拟机规范:


该规范无法预测可能会遇到内部错误或资源限制的地方,并且不能准确地规定何时可以报告它们。因此,VirtualMachineError在Java虚拟机运行期间,可以随时抛出以下定义的任何子类:


在Java中,因此也不例外保证可相对于作出  VirtualMachineError例外。所有例外保证都必须符合“ ...,但如果VirtualMachineError抛出a,则不行”。这是Java与C ++不同的方式之一。


这也表明捕获VirtualMachineError异常没有什么意义,因为如果引发了异常,则程序处于未定义状态。不幸的是,这包括OutOfMemoryError例外。不幸的是,因为如果多个任务之一由于需要太多内存而失败,我们可能要继续执行其他任务。


查看完整回答
反对 回复 2019-10-21
?
qq_花开花谢_0

我看到您已经回答了自己的问题,并且我能理解为什么从严格的C ++背景出发,为什么这会让您感到有些惊讶。这只是托管内存(虚拟)计算机的现实,而不仅限于Java。内存可能会用完,因为JVM限制了它可以使用多少堆内存(可在java命令行上配置)。

在C ++ /机器代码世界中,与之类似但不等效的是GENERAL_PROTECTION_FAULT(如果您使用的是* NIX,则为SEGMENTATION_FAULT),当您尝试寻址尚未分配或位于虚拟地址之外的内存时会得到空间。在这种情况下提供“强大的异常保证”同样困难,因为原因可能是代码中的错误或完全不在程序的控制范围内。


查看完整回答
反对 回复 2019-10-21
?
精慕HU

在Java中,您可以随时调用Thread.stop()或stop(Throwable)。大多数错误被认为是至关重要的,除非您真的知道自己在做什么,否则不要尝试处理它们。

开发服务器端Java应用程序已有12年了,我可以说我从未听说过有人担心会引发随机异常。我怀疑这不是Java您需要担心的问题。

您能否举例说明为什么您认为需要担保,因为可能有另一种解决问题的方法?


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信