try new examples catch and java arrays exception exception-handling try-catch

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.