Arrays.copyOfRange 方法在 java 中抛出不正确的异常

我今天正在研究数组,突然间我遇到了一个抛出意外异常的场景。

如果你看下面的代码,我认为它必须抛出,但令人惊讶的是它却是抛出:ArrayIndexOutOfBoundsExceptionIllegalArgumentException

import java.util.Arrays;
public class RangeTest {
public static void main(String[] args) {
    int[] a = new int[] {0,1,2,3,4,5,6,7,8,9};
    int[] b = Arrays.copyOfRange(a, Integer.MIN_VALUE, 10);
    // If we'll use Integer.MIN_VALUE+100 instead Integer.MIN_VALUE,
    // OutOfMemoryError will be thrown
    for (int k = 0; k < b.length; k++)
        System.out.print(b[k] + " ");
   }
}

任何人都可以帮助我,如果我错了,请告诉我?


答案 1

好吧,Javadoc说:

抛出:

  • ArrayIndexOutOfBoundsException - 如果来自 < 0 或来自 original.length >

  • 非法争议异常 - 如果从>到

查看实现,您可以看到您得到了一个异常,而不是由于溢出:IllegalArgumentExceptionArrayIndexOutOfBoundsExceptionint

public static int[] copyOfRange(int[] original, int from, int to) {
    int newLength = to - from;
    if (newLength < 0)
        throw new IllegalArgumentException(from + " > " + to);
    int[] copy = new int[newLength];
    System.arraycopy(original, from, copy, 0,
                     Math.min(original.length - from, newLength));
    return copy;
}

此代码认为>,因为导致 int 溢出(由于存在),这导致了负数。fromtoto-fromfromInteger.MIN_VALUEnewLength


答案 2

将Integer.MIN_VALUE (-2147483648) 作为从范围发送。您可能打算发送 0 而不是