I've come to Java from C++. In the C++ world we pay attention to exception safety, and note that mutators can provide different guarantees in the face of exceptions thrown by the mutator itself or a method it delegates to (minimum, strong, no-throw). Implementing a method that has a strong exception guarantee requires that some basic operations are guaranteed never to throw an exception. The JLS makes statements about which operations can throw which kinds of exceptions, but the VirtualMachineError
error presents a problem. Quoth the JLS:
an internal error or resource limitation prevents the Java virtual machine from implementing the semantics of the Java programming language; in this case, an instance of a subclass of
VirtualMachineError
is thrown.
The JLS says no more about VirtualMachineError
. An "internal error" means a bug in the JVM, so I'm not interested in that case: in the face of bugs in the JVM, all bets are off. But what about the "resource limitation" case? Are there any operations that are guaranteed never to fail because of a resource limitation?
In Java, you can call Thread.stop() or stop(Throwable) at any time. Most errors are considered so critical that you should not try to handle them unless you really know what you are doing.
Having developed server side Java application for 12 years, I can say I have never heard of anyone worrying about random exceptions being thrown. I suspect its just not an issue you need to worry about with Java.
Can you give an example of why you believe you need a guarantee, as there is likely to be another way to solve the problem?
I see that you've answered your own question and I can understand why this would be mildly surprising to you, coming from a strict C++ background. This is just the reality of managed memory (virtual) machines and it's not limited to just java. Memory can run out, as the JVM is bounded to how much heap it can use (configurable on the java command line).
Somewhat analogous, but not equivalent, in the C++/machine-code world would be a GENERAL_PROTECTION_FAULT (or SEGMENTATION_FAULT if you're on *NIX) that you would get when attempting to address memory that has not been allocated or is outside your virtual address space. Providing a "strong exception guarantee" in the face of that scenario is equally difficult as the cause may be either a bug in code or completely outside the control of the program.
If it is resource limitation, on the first place, no operations takes place. Here is link for perfect example to have VirtualMachineError. Virtual machine error
This error is not something like OutofMemoryError, where by that time some operations might be in progress.
Quoth the Java Virtual Machine Specification:
In Java therefore no exception guarantees can be made with respect to
VirtualMachineError
exceptions. All exception guarantees must be subject to the qualification "... but not if aVirtualMachineError
is thrown". This is one of the ways in which Java is different from C++.This also suggests that there is not much point in catching a
VirtualMachineError
exception, because the program is in an undefined state if one has been thrown. That unfortunately includesOutOfMemoryError
exceptions. Unfortunate, because if one of several tasks fails because it needs too much memory we might want to continue with the other tasks.