# HG changeset patch # User khazra # Date 1336587262 25200 # Node ID ebee74a1fd8c400b34e39fc61ef0165932272522 # Parent 289f842c0175e2c842aa1dd22fe5dbe7ff2b2069 7165118: (prefs) AbstractPreferences.remove(null) does not throw NPE Summary: Insert null argument check in AbstractPreferences.remove() Reviewed-by: dholmes, chegar, alanb diff -r 289f842c0175 -r ebee74a1fd8c jdk/src/share/classes/java/util/prefs/AbstractPreferences.java --- a/jdk/src/share/classes/java/util/prefs/AbstractPreferences.java Wed May 09 07:28:12 2012 -0700 +++ b/jdk/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."); diff -r 289f842c0175 -r ebee74a1fd8c jdk/test/java/util/prefs/RemoveNullKeyCheck.java --- a/jdk/test/java/util/prefs/RemoveNullKeyCheck.java Wed May 09 07:28:12 2012 -0700 +++ b/jdk/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) { + } } }