2015-12-29 2 views
16

Ich arbeitete an Arrays heute und plötzlich stieß ich auf ein Szenario mit unerwarteten Ausnahmen.Array.copyOfRange Methode in Java löst falsche Ausnahme aus

Wenn Sie auf den Code unten schauen, ich denke, es ArrayIndexOutOfBoundsException werfen muss, aber überraschend ist es IllegalArgumentException werfen statt:

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

Kann jemand mir helfen, und lassen Sie mich wissen, wenn ich mich nicht irre?

+0

Der Kommentar in Ihrem Codeabschnitt sagt 'OutOfMemoryError'. Meinten Sie "IllegalArgumentException"? –

Antwort

18

Nun, sagt der Javadoc:

Würfe:

  • ArrayIndexOutOfBoundsException - wenn von < 0 oder von> original.length

  • Illegal - wenn von> bis

bei der Durchführung der Suche können Sie sehen, dass Sie statt ArrayIndexOutOfBoundsException aufgrund int Überlauf eine IllegalArgumentException Ausnahme bekam:

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

Dieser Code denkt, dass from>to weil to-from int Überlauf verursacht (aufgrund from ist Integer.MIN_VALUE), was zu einem negativen newLength führte.

+1

Sie haben Recht so ... es gibt Fehltreffer in doc und Code .... :( –

+0

@ShowStopper Das ist richtig – Eran

+0

Dank @Eran alle Vorschläge in meinem Code zu behandeln, sollte ich es fangen und wieder als indexoutofbound werfen .. ..Arbeit weil Sie scheinen, sind Sie in Java Veteran mehr als 131K Ruf .... genial SIR :) –

3

Sie senden Integer.MIN_VALUE (-2147483648) aus dem Bereich. Wahrscheinlich wollten Sie stattdessen 0 senden

2

Sie stehen Fehler als MIN_VALUE = -2147483648 [0x80000000], die negativ ist. Entweder setzen Sie 0, d.h. Arrays.copyOfRange(a, 0, 10);. Es wird Ihnen erlaubt zu kopieren.

1

Es gibt Fehlanpassung zwischen Java-Docs und Implementierung

Wie von Eran expalained können wir sehen, dass wir eine Illegal Ausnahme statt ArrayIndexOutOfBoundsException bekam wegen int Überlauf.

Verwandte Themen