2012-07-12 15 views
23

Tengo este código simple:String.split volver nula cuando se utiliza un punto

String ip = "1.2.3.4"; 
String[] ipArray = ip.split("."); 
System.out.println(ipArray[1]); 

Y ipArray es nula en el momento en que llegue System.out.println (lanza excepción de puntero nulo).

Mi pregunta es ¿por qué ipArray permanece nulo a pesar de que lo estoy configurando para dividir en cada uno de los .s?

+0

Se está dividiendo en cualquier carácter, por lo que todos los caracteres se dividen sin dejar nada en el conjunto. [string.split] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split (java.lang.String)) toma una expresión regular. – mellamokb

+4

Dot '.' significa" cualquier carácter ":) Necesita un" punto real "' [.] ' – dasblinkenlight

+0

Para ser exactos, dependiendo del modo (DOTALL),' .' coincidirá o no con el carácter de la línea nueva. – nhahtdh

Respuesta

44

Use ip.split("\\."); y sus problemas estarán resueltos. El problema es que String#split recibe una expresión regular, el símbolo de punto (.) Es un carácter especial en expresiones regulares, por lo que debe escaparse para que se interprete como un punto simple, así como la barra invertida es un carácter de escape en Java , tienes que escapar también.

+0

Muy bien, gracias. Lo aceptaré una vez que pueda^_ ^ – CyanPrime

41

. es un carácter especial en expresiones regulares, que es lo que se utiliza para dividir una cadena. Para solucionar esto, necesita escapar del .. Eso nos lleva a \. Desafortunadamente, \ es también un carácter especial en la cadena de Java, por lo que también debe ser escapado, para hacer \\.

Nuestro "final" resultado es ip.split("\\.");

En un asunto relacionado, el conjunto proceso puede evitarse por completo. No tiene sentido hacer algo que una biblioteca estándar ya haya hecho por nosotros.

Considere lo siguiente

byte[] ipOctets = InetAddress.getByName(ip).getAddress(); 

El único problema aquí es recordar que si desea que el valor int, hay que extraerlo con & como int octet = ipOctets[0] & 0xFF;

5

Pattern.quote(String) también se puede utilizar para citar la cadena completa Esto devuelve un patrón que se interpretará literalmente, los caracteres especiales no tendrán un significado especial. Esto podría ser excesivo en este caso, pero a veces puede ser útil.

Cuestiones relacionadas