Improve handling of iterator, to make calling of hasNext() optional (or should it throw an exception?)

diff --git a/src/mapper/java/org/codehaus/jackson/map/MappingIterator.java b/src/mapper/java/org/codehaus/jackson/map/MappingIterator.java
index f981359..22505c9 100644
--- a/src/mapper/java/org/codehaus/jackson/map/MappingIterator.java
+++ b/src/mapper/java/org/codehaus/jackson/map/MappingIterator.java
@@ -135,23 +135,26 @@
         if (_parser == null) {
             return false;
         }
-        JsonToken t = _parser.getCurrentToken();
-        if (t == null) { // un-initialized or cleared; find next
-            if (!_hasNextChecked) {
+        if (!_hasNextChecked) {
+            JsonToken t = _parser.getCurrentToken();
+            _hasNextChecked = true;
+            if (t == null) { // un-initialized or cleared; find next
                 t = _parser.nextToken();
-                _hasNextChecked = true;
-            }
-            // If EOF, no more
-            if (t == null) {
-                if (_closeParser) {
-                    _parser.close();
+                // If EOF, no more
+                if (t == null) {
+                    JsonParser jp = _parser;
+                    _parser = null;
+                    if (_closeParser) {
+                        jp.close();
+                    }
+                    return false;
                 }
-                _parser = null;
-                return false;
-            }
-            // And similarly if we hit END_ARRAY; except that we won't close parser
-            if (t == JsonToken.END_ARRAY) {
-                return false;
+                /* And similarly if we hit END_ARRAY; except that we won't close parser
+                 * (because it's not a root-level iterator)
+                 */
+                if (t == JsonToken.END_ARRAY) {
+                    return false;
+                }
             }
         }
         return true;
@@ -159,6 +162,12 @@
     
     public T nextValue() throws IOException
     {
+        // caller should always call 'hasNext[Value]' first; but let's ensure:
+        if (!_hasNextChecked) {
+            if (!hasNextValue()) {
+                throw new NoSuchElementException();
+            }
+        }
         if (_parser == null) {
             throw new NoSuchElementException();
         }
diff --git a/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializationContext.java b/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializationContext.java
index 5345135..970ac14 100644
--- a/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializationContext.java
+++ b/src/mapper/java/org/codehaus/jackson/map/deser/StdDeserializationContext.java
@@ -238,11 +238,11 @@
      * some String values are acceptable, but the one encountered is not
      */
     @Override
-	public JsonMappingException weirdStringException(Class<?> instClass, String msg)
+    public JsonMappingException weirdStringException(Class<?> instClass, String msg)
     {
         return JsonMappingException.from(_parser, "Can not construct instance of "+instClass.getName()+" from String value '"+_valueDesc()+"': "+msg);
     }
-
+    
     @Override
     public JsonMappingException weirdNumberException(Class<?> instClass, String msg)
     {