2011-10-05 14 views
11

se faccio
perché la funzione di divisione si comporta così in java?

String a = "" 
    String b = a.split(" ")[0]; 

Non sta dando ArrayIndexOutOfBoundException

ma quando lo faccio

String a = " " 
    String b = a.split(" ")[0]; 

E mi sta dando ArrayIndexOutOfBoundException

di nuovo quando faccio

String a = " abc" 
    String b = a.split(" ")[0]; 

Non mi sta dando Eccezione PERCHÉ COSÌ?

+7

Un po 'inaspettato: ". Questo metodo funziona come se richiamando il metodo split due argomenti con l'espressione data e un argomento limite di coda zero stringhe vuote non sono pertanto inclusi nella matrice risultante" http://download.oracle.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29 –

+0

@MariusSolbakkenMellum: hai esattamente ragione, pubblica il tuo commento come risposta! – maerics

+0

@ Mario - perché non hai postato questo come risposta? –

risposta

2

Dopo:

String a = " " 
String[] arr = a.split(" "); 

arr è un array vuoto. Ecco perché getta un ArrayIndexOutOfBoundsException quando si tenta di accedere al suo primo elemento (e non esistente). Ora, dopo:

String a = " abc" 
String[] arr = a.split(" "); 

arr ha un solo elemento: "abc", motivo per cui non viene generata un'eccezione quando si tenta di accedere al suo primo elemento.

0

È sempre possibile che String.split() restituisce un array vuoto se esiste una corrispondenza completa disponibile sul regex

3

È piuttosto strano.

Nel nostro primo esempio, la stringa vuota "" è una stringa, non null. Quindi quando si dice: dividere questo "" con il token "", i pattern non corrispondono e l'array che si ottiene è lo String originale. Lo stesso che hai fatto

String a = "abc"; 
String b = a.split(" ")[0]; 

Il modello da dividere non corrisponde, quindi ottieni un token, la stringa originale.

Si ottiene un'eccezione sul secondo caso perché il contenuto COMPLETO della stringa è esattamente il delimitatore che è stato passato alla divisione, quindi si finisce con una matrice vuota.

Fatemi sapere se volete ulteriori dettagli, ma questo è praticamente tutto.

2

Caso # 1

String a = "" 
String b = a.split(" ")[0]; 

Dal Javadoc:

Se l'espressione non corrisponde alcuna parte dell'input poi il risultante matrice ha solo un elemento, cioè questa stringa .

Così split() ti dà una matrice a elemento singolo, composto dalla stringa di input (""). Quindi non c'è eccezione.

Caso # 2

String a = " " 
String b = a.split(" ")[0]; 

Dal Javadoc:

Trailing stringhe vuote non sono quindi inclusi nel risultante array.

Si hanno due stringhe vuote traendanti e nient'altro. Pertanto si ottiene un array a dimensione zero, con conseguente eccezione.

Caso # 3

String a = " abc" 
String b = a.split(" ")[0]; 

Non è molto di un caso d'angolo come ha chiaramente per tornare almeno un elemento, quindi non fa eccezione.

1

Stringa a = "";

Stringa b = a.split ("") [0];

Quando si esegue questa operazione, poiché non è presente alcun carattere "diviso", non viene eseguita alcuna azione di divisione e viene restituito un array con il primo e solo elemento come stringa vuota.

Stringa a = "";

Stringa b = a.split ("") [0];

mentre in questo caso si cerca di dividere la stringa ma avere nessun valore da collocare in entrambi i lati, quindi si crea alcun array. quindi quando stai provando ad accedere al suo 0 ° elemento, sta dando ArrayOutOfBoundException.

Stringa a = "abc";

Stringa b = a.split ("") [0];

In questo caso, la scissione avviene e "abc" viene posto a casa 0a (credo) e si sono lasciati con una matrice con una dimensione più grande che 0. Problema risolto !! ..

Problemi correlati