2012-07-17 14 views
24

Stavo attraversando un progetto open source, dove stavano creando un flusso di output, e mi sono imbattuto il seguente metodo:Lunghezza matrice Java inferiore a 0?

@Override public void write(byte[] buffer, int offset, int length) { 
    if (buffer == null) { 
     throw new NullPointerException("buffer is null"); 
    } 
    if (buffer.length < 0) { // NOTE HERE 
     throw new IllegalArgumentException("buffer length < 0"); 
    } 
    if (offset < 0) { 
     throw new IndexOutOfBoundsException(String.format("offset %d < 0", offset)); 
    } 
    if (length < 0) { 
     throw new IndexOutOfBoundsException(String.format("length %d < 0", length)); 
    } 
    if (offset > buffer.length || length > buffer.length - offset) { 
     throw new IndexOutOfBoundsException(String.format("offset %d + length %d > buffer"              " length %d", offset, length, buffer.length)); 
    } 
} 

Così il byte[] buffer è solo un normale vecchio byte[]. Sappiamo che non è nullo. È anche possibile farlo avere una lunghezza inferiore a 0? Come, potrebbe essere fatto con riflessione e questo è quello che stanno di guardia contro?

+0

Cosa intendi per "sappiamo che non è" null "? –

+3

@EdwardThomson: Penso che la prima istruzione controlli 'buffer == null' –

+0

Forse da qualche altra parte in quel progetto è una convenzione che' -1' è valido come un modo per dire che un indice non è valido o qualcosa del genere e qui finalmente si trasforma in un'eccezione. – thalador

risposta

29

No, questo non può mai accadere. La lunghezza è garantita per essere non negativa secondo le specifiche Java.

I membri di un tipo di matrice sono tutte le caratteristiche seguenti:

  • La lunghezza campo finale pubblico, che contiene il numero di componenti della matrice. La lunghezza può essere positiva o pari a zero.

Fonte: JLS §10.7

Come mprivat detto, se mai tenta di creare un array di dimensione negativa, saranno gettati un NegativeArraySizeException.

+0

Allora perché controllarlo (<0)? – Reimeus

+4

@Reimeus Per dare alle brave persone in SO qualcosa da discutere. –

+9

@Reimeus: Perché i programmatori non commettono mai errori e scrivono sempre il codice più ottimale. – tskuzzy

6

Non credo sia possibile. Anche attraverso la riflessione, è protetto con NegativeArraySizeException

+0

Mi sono sforzato di modificare la lunghezza di un array in modo riflessivo, ma non sono riuscito a farlo. Il metodo 'getDeclaredFields()' restituisce un risultato vuoto per un input di array, e la classe di riflessione 'Array' non ha comprensibile tale metodo (perché perché lo vorresti mai?) Penso che non modificando la memoria direttamente non ci sarebbe modo per farlo, ma dubito che ci sia in realtà un controllo che impedirebbe questo. Ovviamente, se un programma sta modificando la memoria su di te, hai problemi più grandi di quelli che puoi ottenere con un controllo dei parametri ... – corsiKa

+0

Sì, penso che sia stato solo un brutto codice. L'unico modo per fare in modo che ciò accada sarebbe di fare qualche sorta di modifica del codice byte in qualche modo. E francamente, anche con questo, non sono sicuro al 100% che potrei se la lunghezza è in qualche modo codificata come un numero senza segno (che sospetto sia il caso). – mprivat

+0

Non penso che lo sia, perché non puoi compilare 'int [] a = new int [3000000000];' - Sospetto che sia memorizzato come un 'int' come un altro. – corsiKa

0

Questo è solo un problema di gestione delle eccezioni. Hai la possibilità di creare un array con una dimensione negativa in Java: non genera nemmeno un'eccezione quando lo compili. Ma al momento dell'esecuzione, il tuo programma non funzionerà finché non verrà corretto. (Lancia un NegativeArraySizeException.)

Il problema è che questa eccezione viene lanciata in fase di esecuzione anziché in fase di compilazione. Ecco perché l'eccezione è stata gestita con IllegalArgumentException.

+0

Buono ma serve qualche spiegazione in più .. – Shivaay

+0

"* È consentito creare un array con una dimensione negativa in Java *" - no, non lo sei. È possibile * scrivere * 'new int [-1]' ma la JVM non creerà tale array. Nessun oggetto array Java avrà mai una lunghezza negativa. – dimo414

Problemi correlati