changeset 5570:59121a4c71c6

7165118: (prefs) AbstractPreferences.remove(null) does not throw NPE Summary: Insert null argument check in AbstractPreferences.remove() Reviewed-by: dholmes, chegar, alanb
author khazra
date Wed, 09 May 2012 11:14:22 -0700
parents 5e8caf6984f5
children 6438f1277df6
files src/share/classes/java/util/prefs/AbstractPreferences.java test/java/util/prefs/RemoveNullKeyCheck.java
diffstat 2 files changed, 65 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/util/prefs/AbstractPreferences.java	Wed May 09 07:28:12 2012 -0700
+++ b/src/share/classes/java/util/prefs/AbstractPreferences.java	Wed May 09 11:14:22 2012 -0700
@@ -305,8 +305,10 @@
      * @param key key whose mapping is to be removed from the preference node.
      * @throws IllegalStateException if this node (or an ancestor) has been
      *         removed with the {@link #removeNode()} method.
+     * @throws NullPointerException {@inheritDoc}.
      */
     public void remove(String key) {
+        Objects.requireNonNull(key, "Specified key cannot be null");
         synchronized(lock) {
             if (removed)
                 throw new IllegalStateException("Node has been removed.");
--- a/test/java/util/prefs/RemoveNullKeyCheck.java	Wed May 09 07:28:12 2012 -0700
+++ b/test/java/util/prefs/RemoveNullKeyCheck.java	Wed May 09 11:14:22 2012 -0700
@@ -22,23 +22,77 @@
  */
 
 /* @test
- * @bug 7160242
+ * @bug 7160242 7165118
  * @summary Check if NullPointerException is thrown if the key passed
  *          to remove() is null.
  */
 
 import java.util.prefs.Preferences;
+import java.util.prefs.AbstractPreferences;
+import java.util.prefs.BackingStoreException;
 
 public class RemoveNullKeyCheck {
 
+    private static boolean failed = false;
+
     public static void main(String[] args) throws Exception {
-       try {
-           Preferences node = Preferences.userRoot().node("N1");
-           node.remove(null);
-           throw new RuntimeException("Expected NullPointerException " +
-                                      "not thrown");
-       } catch (NullPointerException npe) {
-           System.out.println("NullPointerException thrown");
-       }
+        checkPreferencesRemove();
+        checkAbstractPreferencesRemove();
+        if (failed) {
+            throw new RuntimeException("Expected NullPointerException " +
+                                       "not thrown");
+        }
+    }
+
+    public static void checkPreferencesRemove() {
+        try {
+            Preferences node = Preferences.userRoot().node("N1");
+            node.remove(null);
+            failed = true;
+        } catch (NullPointerException npe) {
+        }
+    }
+
+    public static void checkAbstractPreferencesRemove() {
+
+        Preferences abstrPrefs = new AbstractPreferences(null, "") {
+            @Override
+            protected void putSpi(String key, String value) {
+            }
+            @Override
+            protected String getSpi(String key) {
+                return null;
+            }
+            @Override
+            protected void removeSpi(String key) {
+            }
+            @Override
+            protected void removeNodeSpi() throws BackingStoreException {
+            }
+            @Override
+            protected String[] keysSpi() throws BackingStoreException {
+                return new String[0];
+            }
+            @Override
+            protected String[] childrenNamesSpi() throws BackingStoreException {
+                return new String[0];
+            }
+            @Override
+            protected AbstractPreferences childSpi(String name) {
+                return null;
+            }
+            @Override
+            protected void syncSpi() throws BackingStoreException {
+            }
+            @Override
+            protected void flushSpi() throws BackingStoreException {
+            }
+        };
+
+        try {
+            abstrPrefs.remove(null);
+            failed = true;
+        } catch(NullPointerException npe) {
+        }
     }
 }