2015-12-29 7 views
16

Oggi stavo lavorando sugli array e all'improvviso mi sono imbattuto in uno scenario che genera eccezioni impreviste.Il metodo Arrays.copyOfRange in java genera un'eccezione errata

Se si guarda il codice qui sotto, credo che debba buttare ArrayIndexOutOfBoundsException, ma sorprendentemente sta gettando IllegalArgumentException invece:

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] + " "); 
    } 
} 

Qualcuno può aiutarmi e fatemi sapere se mi sbaglio?

+0

Il commento nella sezione del codice dice "OutOfMemoryError". Intendevi 'IllegalArgumentException'? –

risposta

18

Beh, Javadoc dice:

Produce:

  • ArrayIndexOutOfBoundsException - se da < 0 o da> original.length

  • IllegalArgumentException - se da> a

Guardando l'attuazione, si può vedere che avete ottenuto un IllegalArgumentException un'eccezione invece di ArrayIndexOutOfBoundsException causa int overflow:

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

Questo codice pensa che from>to perché to-from causato int trabocco (a causa di from è Integer.MIN_VALUE), che ha provocato un newLength negativo.

+1

Hai ragione quindi ... c'è una corrispondenza miss in doc e codice .... :( –

+0

@ShowStopper Questo è corretto – Eran

+0

Grazie a @Eran eventuali suggerimenti per gestire il mio codice, dovrei prenderlo e gettare come indexoutofbound .. ..miking perché sembra che tu sia un veterano di java più di 131K di reputazione .... fantastico SIR :) –

3

Si invia Intero.MIN_VALUE (-2147483648) come da intervallo. Probabilmente intendevi inviare 0 invece

2

Hai un errore con MIN_VALUE = -2147483648 [0x80000000] che è negativo. o si imposta 0, ovvero Arrays.copyOfRange(a, 0, 10);. ti permetterà di copiare.

1

Non c'è partita di sig.na fra Documenti Java e implementazione

Come expalained di Eran possiamo vedere che abbiamo ottenuto un'eccezione IllegalArgumentException invece di ArrayIndexOutOfBoundsException a causa di overflow int.