I stumbled across an interesting error yesterday and have since fixed it, but it still was bothering me this morning, so I would like to see if anyone can shed some light on the issue.
The code in question:
final ResultSet rs = prepStatement.executeQuery();
try
{
if (!rs.next())
{
throw new IllegalStateException("Expected non-empty result");
}
return rs.getInt(0 + 1);
}
finally
{
rs.close();
}
Now for the part that doesn't make since. Every once in a while, the return statement will throw an exception indicating that getInt(int) has been called on a closed ResultSet. I verified that the prepared statement is not being closed anywhere in the code, and if the database was closing, I would see other errors as well. This leads me to believe that somehow, occasionally, the finally block is being executed before the return statement. The only thing I can think of is that the hotspot compiler doesn't always get this right. I'm using the Oracle JVM listed below.
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
I feel like I should mention that I have seen the host of other questions about this ordering, but they all seem to indicate that it is set in stone, where I seem to be witnessing something different.
Try-catch-finally-return clarification
https://stackoverflow.com/questions/20164755/the-order-of-invoking-finally-block
Does finally always execute in Java?
I wrote and compiled the following class
with the following commands
If you follow along with byte code instructions, you will see that at
28
, thers.getInt(1)
is invoked and its value is stored at33
. Thers.close()
is invoked at35
. The stored value is retrieved at40
and returned at41
.What you are experiencing must come from some other point in your code.