无抛出VirtualMachineError保证

时间:2012-01-04 14:56:26

标签: java exception jvm correctness

我是从C ++开始学习Java的。在C ++世界中,我们注意异常安全,并注意,mutator可以在mutator本身抛出的异常或它委托给它的方法(最小,强,无抛出)时提供不同的保证。实现具有强异常保证的方法需要保证一些基本操作永远不会抛出异常。 JLS声明哪些操作可以抛出哪种异常,但VirtualMachineError错误会产生问题。请JLS

  

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

JLS没有更多关于VirtualMachineError的说法。 “内部错误”意味着JVM中的一个错误,所以我对这种情况不感兴趣:面对JVM中的错误,所有的赌注都是关闭的。但是那个“资源限制”案例呢?是否存在由于资源限制而保证永不失败的操作?

4 个答案:

答案 0 :(得分:13)

Java Virtual Machine Specification

  

此规范无法预测内部错误或资源的位置   可能会遇到限制,并不能确切地说明何时   他们可以报道。因此,任何VirtualMachineError子类   下面定义的可以在操作期间的任何时间抛出   Java虚拟机:

因此,在Java中不能对VirtualMachineError例外做出任何例外保证。所有例外保证必须符合资格" ...但是如果抛出VirtualMachineError则不行。"。这是Java与C ++不同的方式之一。

这也表明捕获VirtualMachineError异常并没有多大意义,因为如果抛出一个异常状态,程序将处于未定义状态。不幸的是,这包括OutOfMemoryError个例外。不幸的是,因为如果其中一个任务因为需要太多内存而失败,我们可能会继续执行其他任务。

答案 1 :(得分:1)

如果是资源限制,首先不会发生任何操作。这是一个完美的例子链接VirtualMachineError。 Virtual machine error

这个错误不像OutofMemoryError,那时某些操作可能正在进行中。

答案 2 :(得分:1)

我看到你已经回答了自己的问题,我可以理解为什么这会让你感到轻微的惊讶,来自严格的C ++背景。这只是托管内存(虚拟)机器的现实,它不仅限于java。内存可能耗尽,因为JVM受限于它可以使用多少堆(可在java命令行上配置)。

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

答案 3 :(得分:0)

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

开发服务器端Java应用程序已有12年之久,我可以说我从来没有听说有人担心随机异常会被抛出。我怀疑它不是你需要担心的问题。

您能举例说明您认为需要保证的原因,因为可能有另一种方法可以解决问题吗?