As Julien pointed out, primitive wrappers (like Boolean) are immutable. So when you say successful = false, you're actually reassigning the reference to a new Boolean instance (using Java 1.5's autoboxing).
But in addition to this, you need to recognize that method arguments are copies -- local to the scope of the method. So within your retrieveNext method, reassigning the variable "successful" only changes the object that the local variable is pointing to. However, the "successful" variable outside of the method will continue to point to the original object.
(To verify this, experiment using combinations of "successful" and "this.successful" within the method.)
"We're kind of on the level of crossword puzzle writers... And no one ever goes to them and gives them an award." ~Joe Strummer sscce.org
Java only has "pass by value", not "pass by reference." However, there are other techniquest to achieve the same effect. The most obvious is to return a boolean. In this situation, it doesn't seem to make sense because retrieveNext() already returns a double. So what does the boolean value represent? It looks like it indicates whether the method succeeds based on some criterion. In such as situation, you might consider throwing an exception. This is particularly ideal if "failure" indicates that the class has entered an invalid state that should not occur. This usually means that something is wrong in your code that is causing somethign to happen that should never happen in the finished product. I think exception handling is an ideal way to deal with "success" and "failure" in such a situation. Another suggestion is to have a member field that indicates success or not. However, this is only helpful to other methods in the same class. Otherwise you need to add a getter method. I think an exception would be a much cleaner way to deal with this than a member variable.
I hope this help. If anything is unclear, please let me know so I can answer any questions you may have.