2012-03-16 13 views
6

Estoy bastante seguro de que la respuesta es sí, pero solo quiero confirmar que nunca hay una situación en la que una cadena no nula (independientemente de lo que contenga) devuelva algo excepto una cadena válida como primer miembro de la matriz devuelto por split.¿es siempre seguro usar el primer elemento de la matriz devuelta por split?

En otras palabras.

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

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

Tengo entendido que la barra nunca será nula y que la línea de asignación no tiene manera de fallar. Si el delimitador no se encuentra en la cadena, simplemente devuelve foo en su totalidad como el primer elemento de la matriz devuelta.

+1

Es fácil comprobar este tipo de comportamiento simplemente escribiendo un pequeño programa que prueba este caso, y mira lo que obtienes – mfrankli

+0

Lo es. Incluso si no contiene la expresión regular dada, siempre devolverá la cadena inicial. –

+0

@mfrankli, gracias. Eso fue un consejo casi útil. Obviamente puedo escribir un programa de prueba (y tengo) ... Pregunto sobre alguna posible condición atípica que no haya considerado o pensado. –

Respuesta

9

No,, It may fail

éste deje de ArrayIndexOutOfBound si el foo =","

+1

Impar, supongo que devolverá dos cadenas vacías y las rellenará como [0] y [1]. Definitivamente +1 si tiene razón sobre esto .. –

+0

Visite el código de demostración de demostración –

+0

+1 Muy buena captura. –

1

(1) Si foo es una coincidencia directa para el patrón de expresión regular, la matriz de regresar de split tiene longitud 0 y foo.split[0] lanzará una ArrayIndexOutOfBoundsException.

(2) Tenga en cuenta que String.split puede arrojar un PatternSyntaxException si la expresión regular no es válida en el tiempo de ejecución.

+0

que es extremadamente bueno saber y precisamente por qué pensé que sería bueno preguntar! :) –

+0

@ Dr.Dredel verificó la advertencia de Jigar y la actualizó. Yo también estaba sorprendido. – paislee

+0

Consulte la respuesta de Jigar Joshi. –

1

Sí. bar será igual a la cadena ""

.split (",") intenta dividirse después de la coma, pero no hay una coma en la cadena original, , por lo que se devolverá la cadena original.

Lo que sería más complicado es:

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

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

Aquí sarray [0] volverá ArrayIndexOutOfBoundsException.

1

Aquí es un conjunto de casos de prueba para usted que demuestran lo anterior:

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

cuando es ejecutado, esto es lo que se obtiene:

$ 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

No es necesario 'if (null == y)' en Java si 'y' no es' boolean'. Simplemente use 'if (y == null)' como más claro. –

Cuestiones relacionadas