没有抛出VirtualMachineError保证
我从C ++来到Java。 在C ++世界里,我们注意到exception的安全性,并且注意到,在mutator本身或者委托给它的方法(最小,强壮,无丢包)的情况下,mutators可以提供不同的保证。 实现具有强大exception保证的方法要求保证一些基本的操作不会抛出exception。 JLS声明哪些操作可以抛出哪种exception,但是VirtualMachineError
错误会出现问题。 JLS :
内部错误或资源限制阻止Java虚拟机实现Java编程语言的语义; 在这种情况下,引发
VirtualMachineError
的子类的一个实例。
JLS没有多说VirtualMachineError
。 “内部错误”意味着JVM中的一个错误,所以我对这种情况不感兴趣:面对JVM中的错误,所有的投注都closures。 但是“资源限制”情况呢? 是否有任何保证永远不会因为资源限制而失败的操作?
引用Java虚拟机规范 :
本规范不能预测可能遇到的内部错误或资源限制,并且不能精确地规定何时可以报告。 因此,下面定义的
VirtualMachineError
子类中的任何一个都可以在Java虚拟机操作期间随时抛出:
因此在Java中, VirtualMachineError
exception没有例外的保证 。 所有的exception保证都必须符合条件“…但是如果VirtualMachineError
被抛出”。 这是Java与C ++不同的方法之一。
这也表明捕获VirtualMachineError
exception没有太大的意义,因为如果抛出了一个,程序处于未定义的状态。 这不幸包括OutOfMemoryError
exception。 不幸的是,因为如果其中一个任务失败,因为它需要太多的内存,我们可能想继续其他任务。
如果是资源限制,首先,不进行任何操作。 这里是链接完美的例子有VirtualMachineError。 虚拟机错误
这个错误不像OutofMemoryError,到那时某些操作可能正在进行。
我看到你已经回答了你自己的问题,我可以理解为什么这将是一个严格的C + +背景,对你来说是轻度惊讶。 这只是pipe理内存(虚拟)机器的现实,并不仅限于java。 内存可能会耗尽,因为JVM受限于可以使用多less堆(可在java命令行上configuration)。
在C ++ /机器代码世界中,有些类似但不等同的东西,将是一个GENERAL_PROTECTION_FAULT(或SEGMENTATION_FAULT,如果你在* NIX),当你试图寻址尚未被分配的内存或者在你的虚拟地址之外空间。 面对这种情况,提供“强有力的例外保证”同样困难,因为原因可能是代码错误或完全不在程序控制范围之内。
在Java中,您可以随时调用Thread.stop()或停止(Throwable)。 大多数错误被认为是非常重要的,除非你真的知道你在做什么,否则你不应该试图去处理它们。
在开发了服务器端Java应用程序12年之后,我可以说我从来没有听说任何人担心抛出随机exception。 我怀疑它不是一个你需要担心的Java问题。
你能否举一个你为什么相信你需要保证的例子,因为可能有另外一种方法来解决这个问题?