Метод Arrays.copyOfRange в java вызывает неправильное исключение

Сегодня я работал над массивами, и внезапно я наткнулся на сценарий, в котором были неожиданные исключения.

Если вы посмотрите на код ниже, я думаю, что он должен бросить ArrayIndexOutOfBoundsException, но на удивление бросает IllegalArgumentException вместо этого:

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

Ну, Джавадок говорит:

Броски:

  • ArrayIndexOutOfBoundsException - если из < 0 или из > original.length

  • IllegalArgumentException - если от > до

Посмотрев на реализацию, вы увидите, что вместо ArrayIndexOutOfBoundsException исключение IllegalArgumentException из-за переполнения int:

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;
}

Этот код считает, что from > to, потому что to-from вызвал переполнение int (из-за from было Integer.MIN_VALUE), что привело к отрицательному newLength.

Ответ 2

Вы отправляете Integer.MIN_VALUE (-2147483648) как из диапазона. Вы, вероятно, хотели отправить 0 вместо

Ответ 3

Вы сталкиваетесь с ошибкой как MIN_VALUE = -2147483648 [0x80000000], которая является отрицательной. либо u задает 0, т.е. Arrays.copyOfRange(a, 0, 10);. это позволит вам скопировать.

Ответ 4

Промежуточное совпадение между java Docs и реализацией

Как показано Эраном, мы видим, что вместо исключения ArrayIndexOutOfBoundsEx мы получили исключение IllegalArgumentException из-за переполнения int.