new - El método Arrays.copyOfRange en Java lanza una excepción incorrecta
try catch throw java (4)
Hoy estuve trabajando en arreglos y de repente me encontré con un escenario que presentaba excepciones inesperadas.
Si miras el código de abajo, creo que debe lanzar ArrayIndexOutOfBoundsException
, pero sorprendentemente está lanzando IllegalArgumentException
en IllegalArgumentException
lugar:
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] + " ");
}
}
¿Alguien puede ayudarme y avisarme si estoy equivocado?
Bueno, el Javadoc dice:
Tiros
ArrayIndexOutOfBoundsException - si es de <0 o de> original.length
IllegalArgumentException - si de> a
Al observar la implementación, puede ver que recibió una excepción IllegalArgumentException
lugar de ArrayIndexOutOfBoundsException
debido a un desbordamiento de 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;
}
Este código piensa que from
> to
porque to-from
causó un desbordamiento int (debido a que es Integer.MIN_VALUE
), lo que resultó en un newLength
negativo.
Envía Integer.MIN_VALUE (-2147483648) desde el rango. Probablemente quisiste enviar 0 en lugar de
Hay una coincidencia de errores entre los documentos de Java y la implementación
Como explicó Eran, podemos ver que obtuvimos una excepción IllegalArgumentException en lugar de ArrayIndexOutOfBoundsException debido a un desbordamiento de int.
Te enfrentas a un error como MIN_VALUE = -2147483648 [0x80000000] que es negativo. o u establece 0, es decir, Arrays.copyOfRange(a, 0, 10);
. te permitirá copiar.