Метод 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
исключение 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.