2012-03-16 8 views
6

Sono abbastanza sicuro che la risposta è sì, ma voglio solo confermare che non c'è mai una situazione in cui una stringa non nulla (indipendentemente da ciò che contiene) restituisce qualcosa tranne una stringa valida come primo membro dell'array restituito da split.è sempre sicuro utilizzare il primo elemento dell'array restituito da split?

In altre parole.

String foo = ""; // or "something" or "a b c" or any valid string at all 

String[] bar = foo.split(",")[0]; 

La mia comprensione è che la barra non sarà mai nullo e la linea di assegnazione non ha modo di fallire. Se il delimitatore non viene trovato nella stringa, restituisce semplicemente foo nella sua interezza come primo elemento dell'array restituito.

+1

E 'facile controllare questo tipo di comportamento, semplicemente scrivendo un piccolo programma che prova questo caso e vedi cosa ottieni – mfrankli

+0

Lo è. Anche se non contiene la regex fornita, restituirà sempre la stringa iniziale. –

+0

@mfrankli, grazie. Era quasi un consiglio utile. Ovviamente posso scrivere un programma di test (e avere) ... Sto chiedendo alcune possibili condizioni anomale a cui non ho pensato o pensato. –

risposta

9

No,, It may fail

E non riuscirebbe a ArrayIndexOutOfBound se il foo =","

+1

Dispari, suppongo che restituirebbe due stringhe vuote e le popolerei come [0] e [1]. Sicuramente +1 se hai ragione su questo .. –

+0

Si prega di visitare il codice collegato dimostrazione –

+0

+1 Molto buona cattura. –

1

(1) Se foo è una corrispondenza diretta per il pattern regex, la matrice restituita da split ha lunghezza 0 e foo.split[0] genererà un ArrayIndexOutOfBoundsException.

(2) Tenere presente che String.split può generare uno PatternSyntaxException se l'espressione regolare non è valida in fase di esecuzione.

+0

che è estremamente bello sapere e precisamente perché ho pensato che sarebbe stato bello chiedere! :) –

+0

@ Dr.Dredel ha verificato l'avviso di Jigar e aggiornato. Anch'io sono stato sorpreso. – paislee

+0

Per favore, vedi la risposta di Jigar Joshi. –

1

Sì. barra sarà uguale alla stringa ""

.split (",") tenta di dividere dopo la virgola, ma non vi è alcuna virgola nella stringa originale, in modo che la stringa originale venga restituita.

Quale sarebbe più complicato è:

String s = ",,,,,,," 

String[] sarray = s.split(","); 

Qui sArray [0] tornerà ArrayIndexOutOfBoundsException.

1

Ecco una serie di casi di test per voi che dimostrano quanto sopra:

public class Test { 
    public static void main(String[] args){ 
     test("x,y"); 
     test(",y"); 
     test(""); 
     test(","); 
    } 

    private static void test(String x){ 
     System.out.println("testing split on value ["+x+"]"); 
     String y = x.split(",")[0]; 
     if(null == y){ 
      System.out.println("x returned a null value for first array element"); 
     } else if(y.length() < 1) { 
      System.out.println("x returned an empty string for first array element"); 
     } else { 
      System.out.println("x returned a value for first array element"); 
     } 
    } 
} 

Quando eseguito, questo è quello che si ottiene:

$ javac Test.java && java Test 
testing split on value [x,y] 
x returned a value for first array element 
testing split on value [,y] 
x returned an empty string for first array element 
testing split on value [] 
x returned an empty string for first array element 
testing split on value [,] 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
     at Test.test(Test.java:11) 
     at Test.main(Test.java:6) 
+1

Non c'è bisogno di 'if (null == y)' in Java se 'y' non è un' booleano'. Semplicemente usa 'if (y == null)' come più chiaro. –

Problemi correlati