Revise preconditions in the newly introduced classes.

Change-Id: I044a537398f4b6d3064e3f13ee74b4a782e197bc
diff --git a/user/super/com/google/gwt/emul/java/lang/String.java b/user/super/com/google/gwt/emul/java/lang/String.java
index 5e106c2..18e1a5b 100644
--- a/user/super/com/google/gwt/emul/java/lang/String.java
+++ b/user/super/com/google/gwt/emul/java/lang/String.java
@@ -16,7 +16,6 @@
 
 package java.lang;
 
-import static javaemul.internal.InternalPreconditions.checkNotNull;
 import static javaemul.internal.InternalPreconditions.checkStringBounds;
 
 import java.io.Serializable;
@@ -113,8 +112,6 @@
   }
 
   public static String join(CharSequence delimiter, CharSequence... elements) {
-    checkNotNull(delimiter, "delimiter");
-    checkNotNull(elements, "elements");
     StringJoiner joiner = new StringJoiner(delimiter);
     for (CharSequence e : elements) {
       joiner.add(e);
@@ -123,8 +120,6 @@
   }
 
   public static String join(CharSequence delimiter, Iterable<? extends CharSequence> elements) {
-    checkNotNull(delimiter, "delimiter");
-    checkNotNull(elements, "elements");
     StringJoiner joiner = new StringJoiner(delimiter);
     for (CharSequence e : elements) {
       joiner.add(e);
diff --git a/user/super/com/google/gwt/emul/java/util/Comparator.java b/user/super/com/google/gwt/emul/java/util/Comparator.java
index e0a9813..9b8235d 100644
--- a/user/super/com/google/gwt/emul/java/util/Comparator.java
+++ b/user/super/com/google/gwt/emul/java/util/Comparator.java
@@ -15,7 +15,7 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
+import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 import java.io.Serializable;
 import java.util.function.Function;
@@ -43,7 +43,7 @@
   }
 
   default Comparator<T> thenComparing(Comparator<? super T> other) {
-    checkCriticalNotNull(other);
+    checkNotNull(other);
     return (Comparator<T> & Serializable) (a, b) -> {
       int c = compare(a, b);
       return (c != 0) ? c : other.compare(a, b);
@@ -74,8 +74,8 @@
 
   static <T, U> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor,
       Comparator<? super U> keyComparator) {
-    checkCriticalNotNull(keyExtractor);
-    checkCriticalNotNull(keyComparator);
+    checkNotNull(keyExtractor);
+    checkNotNull(keyComparator);
     return (Comparator<T> & Serializable) (a, b) ->
         keyComparator.compare(keyExtractor.apply(a), keyExtractor.apply(b));
   }
@@ -86,19 +86,19 @@
   }
 
   static<T> Comparator<T> comparingDouble(ToDoubleFunction<? super T> keyExtractor) {
-    checkCriticalNotNull(keyExtractor);
+    checkNotNull(keyExtractor);
     return (Comparator<T> & Serializable) (a, b) ->
         Double.compare(keyExtractor.applyAsDouble(a), keyExtractor.applyAsDouble(b));
   }
 
   static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor) {
-    checkCriticalNotNull(keyExtractor);
+    checkNotNull(keyExtractor);
     return (Comparator<T> & Serializable) (a, b) ->
         Integer.compare(keyExtractor.applyAsInt(a), keyExtractor.applyAsInt(b));
   }
 
   static <T> Comparator<T> comparingLong(ToLongFunction<? super T> keyExtractor) {
-    checkCriticalNotNull(keyExtractor);
+    checkNotNull(keyExtractor);
     return (Comparator<T> & Serializable) (a, b) ->
         Long.compare(keyExtractor.applyAsLong(a), keyExtractor.applyAsLong(b));
   }
diff --git a/user/super/com/google/gwt/emul/java/util/Map.java b/user/super/com/google/gwt/emul/java/util/Map.java
index c5cccd2..41e6449 100644
--- a/user/super/com/google/gwt/emul/java/util/Map.java
+++ b/user/super/com/google/gwt/emul/java/util/Map.java
@@ -15,7 +15,6 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 import java.io.Serializable;
@@ -52,7 +51,7 @@
     }
 
     static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
-      checkCriticalNotNull(cmp);
+      checkNotNull(cmp);
       return (Comparator<Map.Entry<K, V>> & Serializable)
           (a, b) -> cmp.compare(a.getKey(), b.getKey());
     }
@@ -62,7 +61,7 @@
     }
 
     static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
-      checkCriticalNotNull(cmp);
+      checkNotNull(cmp);
       return (Comparator<Map.Entry<K, V>> & Serializable)
           (a, b) -> cmp.compare(a.getValue(), b.getValue());
     }
diff --git a/user/super/com/google/gwt/emul/java/util/Optional.java b/user/super/com/google/gwt/emul/java/util/Optional.java
index 51b5f15..8dc4a8f 100644
--- a/user/super/com/google/gwt/emul/java/util/Optional.java
+++ b/user/super/com/google/gwt/emul/java/util/Optional.java
@@ -22,6 +22,7 @@
 
 import static javaemul.internal.InternalPreconditions.checkCriticalElement;
 import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
+import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 /**
  * See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html">
@@ -37,23 +38,19 @@
   }
 
   public static <T> Optional<T> of(T value) {
-    return new Optional<>(value);
+    return new Optional<>(checkCriticalNotNull(value));
   }
 
   public static <T> Optional<T> ofNullable(T value) {
     return value == null ? empty() : of(value);
   }
 
-  private static final Optional<?> EMPTY = new Optional<>();
+  private static final Optional<?> EMPTY = new Optional<>(null);
 
   private final T ref;
 
-  private Optional() {
-    ref = null;
-  }
-
   private Optional(T ref) {
-    this.ref = checkCriticalNotNull(ref);
+    this.ref = ref;
   }
 
   public boolean isPresent() {
@@ -72,7 +69,7 @@
   }
 
   public Optional<T> filter(Predicate<? super T> predicate) {
-    checkCriticalNotNull(predicate);
+    checkNotNull(predicate);
     if (!isPresent() || predicate.test(ref)) {
       return this;
     }
@@ -80,7 +77,7 @@
   }
 
   public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
-    checkCriticalNotNull(mapper);
+    checkNotNull(mapper);
     if (isPresent()) {
       return ofNullable(mapper.apply(ref));
     }
@@ -88,9 +85,9 @@
   }
 
   public <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
-    checkCriticalNotNull(mapper);
+    checkNotNull(mapper);
     if (isPresent()) {
-      return checkCriticalNotNull(mapper.apply(ref));
+      return checkNotNull(mapper.apply(ref));
     }
     return empty();
   }
diff --git a/user/super/com/google/gwt/emul/java/util/PrimitiveIterator.java b/user/super/com/google/gwt/emul/java/util/PrimitiveIterator.java
index a08b931..e80f586 100644
--- a/user/super/com/google/gwt/emul/java/util/PrimitiveIterator.java
+++ b/user/super/com/google/gwt/emul/java/util/PrimitiveIterator.java
@@ -15,7 +15,6 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 import java.util.function.Consumer;
@@ -59,7 +58,6 @@
       if (consumer instanceof DoubleConsumer) {
         forEachRemaining((DoubleConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((DoubleConsumer) consumer::accept);
       }
     }
@@ -90,7 +88,6 @@
       if (consumer instanceof IntConsumer) {
         forEachRemaining((IntConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((IntConsumer) consumer::accept);
       }
     }
@@ -121,7 +118,6 @@
       if (consumer instanceof LongConsumer) {
         forEachRemaining((LongConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((LongConsumer) consumer::accept);
       }
     }
diff --git a/user/super/com/google/gwt/emul/java/util/Spliterator.java b/user/super/com/google/gwt/emul/java/util/Spliterator.java
index 365efd2..96abc22 100644
--- a/user/super/com/google/gwt/emul/java/util/Spliterator.java
+++ b/user/super/com/google/gwt/emul/java/util/Spliterator.java
@@ -15,9 +15,6 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
-import static javaemul.internal.InternalPreconditions.checkNotNull;
-
 import java.util.function.Consumer;
 import java.util.function.DoubleConsumer;
 import java.util.function.IntConsumer;
@@ -52,7 +49,6 @@
   long estimateSize();
 
   default void forEachRemaining(Consumer<? super T> consumer) {
-    checkNotNull(consumer);
     while (tryAdvance(consumer)) { }
   }
 
@@ -88,7 +84,6 @@
     S trySplit();
 
     default void forEachRemaining(C consumer) {
-      checkNotNull(consumer);
       while (tryAdvance(consumer)) { }
     }
   }
@@ -103,7 +98,6 @@
       if (consumer instanceof DoubleConsumer) {
         return tryAdvance((DoubleConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         return tryAdvance((DoubleConsumer) consumer::accept);
       }
     }
@@ -113,7 +107,6 @@
       if (consumer instanceof DoubleConsumer) {
         forEachRemaining((DoubleConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((DoubleConsumer) consumer::accept);
       }
     }
@@ -129,7 +122,6 @@
       if (consumer instanceof IntConsumer) {
         return tryAdvance((IntConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         return tryAdvance((IntConsumer) consumer::accept);
       }
     }
@@ -139,7 +131,6 @@
       if (consumer instanceof IntConsumer) {
         forEachRemaining((IntConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((IntConsumer) consumer::accept);
       }
     }
@@ -155,7 +146,6 @@
       if (consumer instanceof LongConsumer) {
         return tryAdvance((LongConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         return tryAdvance((LongConsumer) consumer::accept);
       }
     }
@@ -165,7 +155,6 @@
       if (consumer instanceof LongConsumer) {
         forEachRemaining((LongConsumer) consumer);
       } else {
-        checkCriticalNotNull(consumer);
         forEachRemaining((LongConsumer) consumer::accept);
       }
     }
diff --git a/user/super/com/google/gwt/emul/java/util/Spliterators.java b/user/super/com/google/gwt/emul/java/util/Spliterators.java
index 7e44465..f14bad7 100644
--- a/user/super/com/google/gwt/emul/java/util/Spliterators.java
+++ b/user/super/com/google/gwt/emul/java/util/Spliterators.java
@@ -15,8 +15,8 @@
  */
 package java.util;
 
+import static javaemul.internal.InternalPreconditions.checkCriticalArrayBounds;
 import static javaemul.internal.InternalPreconditions.checkCriticalElement;
-import static javaemul.internal.InternalPreconditions.checkCriticalPositionIndexes;
 import static javaemul.internal.InternalPreconditions.checkCriticalState;
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
@@ -586,7 +586,7 @@
     private final int characteristics;
 
     BaseArraySpliterator(int from, int limit, int size, int characteristics) {
-      checkCriticalPositionIndexes(from, limit, size);
+      checkCriticalArrayBounds(from, limit, size);
       this.index = from;
       this.limit = limit;
       this.characteristics = sizeKnownSpliteratorCharacteristics(characteristics);
diff --git a/user/super/com/google/gwt/emul/java/util/StringJoiner.java b/user/super/com/google/gwt/emul/java/util/StringJoiner.java
index 8aba2fa..6f26084 100644
--- a/user/super/com/google/gwt/emul/java/util/StringJoiner.java
+++ b/user/super/com/google/gwt/emul/java/util/StringJoiner.java
@@ -15,8 +15,6 @@
  */
 package java.util;
 
-import static javaemul.internal.InternalPreconditions.checkNotNull;
-
 /**
  * See <a href="https://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html">
  * the official Java API doc</a> for details.
@@ -35,9 +33,6 @@
   }
 
   public StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) {
-    checkNotNull(delimiter, "delimiter");
-    checkNotNull(prefix, "prefix");
-    checkNotNull(suffix, "suffix");
     this.delimiter = delimiter.toString();
     this.prefix = prefix.toString();
     this.suffix = suffix.toString();
@@ -69,7 +64,6 @@
   }
 
   public StringJoiner setEmptyValue(CharSequence emptyValue) {
-    checkNotNull(emptyValue);
     this.emptyValue = emptyValue.toString();
     return this;
   }
diff --git a/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java b/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
index 6321623..56812ce 100644
--- a/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
+++ b/user/super/com/google/gwt/emul/javaemul/internal/InternalPreconditions.java
@@ -444,6 +444,23 @@
   /**
    * Checks that bounds are correct.
    *
+   * @throws ArrayIndexOutOfBoundsException if the range is not legal
+   */
+  public static void checkCriticalArrayBounds(int start, int end, int length) {
+    if (start < 0) {
+      throw new ArrayIndexOutOfBoundsException("fromIndex: " + start + " < 0");
+    }
+    if (end > length) {
+      throw new ArrayIndexOutOfBoundsException("toIndex: " + end + " > length " + length);
+    }
+    if (start > end) {
+      throw new IllegalArgumentException("fromIndex: " + start + " > toIndex: " + end);
+    }
+  }
+
+  /**
+   * Checks that bounds are correct.
+   *
    * @throws StringIndexOutOfBoundsException if the range is not legal
    */
   public static void checkStringBounds(int start, int end, int size) {