Index: src/java/org/apache/lucene/analysis/CharArraySet.java
===================================================================
--- src/java/org/apache/lucene/analysis/CharArraySet.java	(revision 896905)
+++ src/java/org/apache/lucene/analysis/CharArraySet.java	(working copy)
@@ -157,12 +157,16 @@
   /** true if the <code>len</code> chars of <code>text</code> starting at <code>off</code>
    * are in the set */
   public boolean contains(char[] text, int off, int len) {
-    return entries[getSlot(text, off, len)] != null;
+    if(text == null)
+      throw new NullPointerException("char[] is null");
+    return count != 0 && entries[getSlot(text, off, len)] != null;
   }
 
   /** true if the <code>CharSequence</code> is in the set */
   public boolean contains(CharSequence cs) {
-    return entries[getSlot(cs)] != null;
+    if(cs == null)
+      throw new NullPointerException("CharSequence is null");
+    return count != 0 && entries[getSlot(cs)] != null;
   }
 
   private int getSlot(char[] text, int off, int len) {
@@ -332,6 +336,11 @@
 
   @Override
   public boolean contains(Object o) {
+    if(o == null)
+      throw new NullPointerException("Object is null");
+    /* don't do an count == 0 check here this could swallow a NPE if o.toString()
+     * returns null.
+     */
     if (o instanceof char[]) {
       final char[] text = (char[])o;
       return contains(text, 0, text.length);
Index: src/test/org/apache/lucene/analysis/TestCharArraySet.java
===================================================================
--- src/test/org/apache/lucene/analysis/TestCharArraySet.java	(revision 896905)
+++ src/test/org/apache/lucene/analysis/TestCharArraySet.java	(working copy)
@@ -26,7 +26,9 @@
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.Version;
 
-
+/**
+ * TestCase for {@link CharArraySet} 
+ */
 public class TestCharArraySet extends LuceneTestCase {
   
   static final String[] TEST_STOP_WORDS = {
@@ -364,7 +366,6 @@
     for (String string : newWords) {
       assertFalse(setIngoreCase.contains(string));  
       assertFalse(setCaseSensitive.contains(string));  
-
     }
   }
   
@@ -404,4 +405,55 @@
       assertFalse(set.contains(string));  
     }
   }
+  
+  /**
+   * Tests a special case of {@link CharArraySet#copy(Version, Set)} where the
+   * set to copy is the {@link CharArraySet#EMPTY_SET}
+   */
+  public void testCopyEmptySet() {
+    assertSame(CharArraySet.EMPTY_SET, CharArraySet.copy(Version.LUCENE_CURRENT, CharArraySet.EMPTY_SET));
+  }
+  
+  /**
+   * Smoketests the static empty set
+   */
+  public void testEmptySet() {
+    assertEquals(0, CharArraySet.EMPTY_SET.size());
+    // must be unmodifiable
+    assertEquals(CharArraySet.unmodifiableSet(
+        new CharArraySet(Version.LUCENE_CURRENT, 0, true)).getClass(),
+        CharArraySet.EMPTY_SET.getClass());
+    assertTrue(CharArraySet.EMPTY_SET.isEmpty());
+    for (String stopword : TEST_STOP_WORDS) {
+      assertFalse(CharArraySet.EMPTY_SET.contains(stopword));
+    }
+    assertFalse(CharArraySet.EMPTY_SET.contains((Object)"foo"));
+    assertFalse(CharArraySet.EMPTY_SET.contains((Object)"foo".toCharArray()));
+    assertFalse(CharArraySet.EMPTY_SET.contains("foo".toCharArray(),0,3));
+  }
+  
+  /**
+   * Test for NPE 
+   */
+  public void testContainsWithNull() {
+    CharArraySet set = new CharArraySet(Version.LUCENE_CURRENT, 1, true);
+    try{
+      set.contains((char[]) null, 0, 10);
+      fail("null value must raise NPE");
+    }catch (NullPointerException e) {
+      //
+    }
+    try{
+      set.contains((CharSequence) null);
+      fail("null value must raise NPE");
+    }catch (NullPointerException e) {
+      //
+    }
+    try{
+      set.contains((Object) null);
+      fail("null value must raise NPE");
+    }catch (NullPointerException e) {
+      //
+    }
+  }
 }
