--- old/src/share/classes/java/util/AbstractList.java 2014-03-13 23:34:01.165432827 +0400
+++ new/src/share/classes/java/util/AbstractList.java 2014-03-13 23:34:00.689438810 +0400
@@ -563,14 +563,14 @@
* This call shortens the list by {@code (toIndex - fromIndex)} elements.
* (If {@code toIndex==fromIndex}, this operation has no effect.)
*
- *
This method is called by the {@code clear} operation on this list
+ * @implSpec
+ * This method is called by the {@code clear} operation on this list
* and its subLists. Overriding this method to take advantage of
* the internals of the list implementation can substantially
* improve the performance of the {@code clear} operation on this list
* and its subLists.
*
- * @implSpec
- * This implementation gets a list iterator positioned before
+ *
This implementation gets a list iterator positioned before
* {@code fromIndex}, and repeatedly calls {@code ListIterator.next}
* followed by {@code ListIterator.remove} until the entire range has
* been removed. Note: if {@code ListIterator.remove} requires linear
@@ -578,6 +578,10 @@
*
* @param fromIndex index of first element to be removed
* @param toIndex index after last element to be removed
+ *
+ * @throws IndexOutOfBoundsException if {@code (fromIndex < 0 ||
+ * fromIndex > size())}
+ * @throws NoSuchElementException if {@code (toIndex > size())}
*/
protected void removeRange(int fromIndex, int toIndex) {
ListIterator it = listIterator(fromIndex);
--- old/src/share/classes/java/util/ArrayList.java 2014-03-13 23:34:02.717413315 +0400
+++ new/src/share/classes/java/util/ArrayList.java 2014-03-13 23:34:02.073421412 +0400
@@ -609,12 +609,14 @@
* @throws IndexOutOfBoundsException if {@code fromIndex} or
* {@code toIndex} is out of range
* ({@code fromIndex < 0 ||
- * fromIndex >= size() ||
* toIndex > size() ||
* toIndex < fromIndex})
*/
protected void removeRange(int fromIndex, int toIndex) {
modCount++;
+ if (fromIndex > toIndex)
+ throw new IndexOutOfBoundsException(
+ "From Index: " + fromIndex + " > To Index: " + toIndex);
int numMoved = size - toIndex;
System.arraycopy(elementData, toIndex, elementData, fromIndex,
numMoved);
--- /dev/null 2014-03-13 07:12:42.522638456 +0400
+++ new/test/java/util/ArrayList/RemoveRange.java 2014-03-13 23:34:03.941397929 +0400
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 8014066
+ * @summary Make sure that ArrayList#removeRange() method throws IOB when necessary
+ */
+
+import java.util.ArrayList;
+
+public class RemoveRange extends ArrayList {
+ public static void main(String[] args) throws Throwable {
+ RemoveRange list = new RemoveRange();
+ for (int i = 0; i != 11; ++i)
+ list.add(i);
+
+ final int START_INDEX = -2;
+ final int END_INDEX = list.size() + 2;
+
+ for (int fromIndex = START_INDEX; fromIndex <= END_INDEX; ++fromIndex) {
+ for (int toIndex = START_INDEX; toIndex <= END_INDEX; ++toIndex) {
+ if (fromIndex < 0
+ || toIndex > list.size()
+ || toIndex < fromIndex) {
+ // make sure the expected exception is thrown
+ test(list, fromIndex, toIndex);
+ } else {
+ // should not throw
+ // this include the case list.removeRange(list.size(), list.size())
+ RemoveRange list1 = (RemoveRange)list.clone();
+ list1.removeRange(fromIndex, toIndex);
+ }
+ }
+ }
+ }
+
+ static void test(RemoveRange list, int fromIndex, int toIndex)
+ throws Throwable {
+ try {
+ list.removeRange(fromIndex, toIndex);
+ throw new AssertionError(
+ "ArrayList.removeRange(" + fromIndex + ", " + toIndex + "): "
+ + "no expected IndexOutOfBoundsException thrown");
+ } catch (IndexOutOfBoundsException ok) {
+ }
+ }
+}