2012-07-12 28 views
23

ho ottenuto questo semplice codice:String.split ritorno nullo quando si utilizza un punto

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

E ipArray è nullo nel momento in cui colpisce System.out.println (lancia un'eccezione di puntatore nullo).

La mia domanda è perché ipArray rimane nullo anche se lo sto impostando per dividere su ciascuno di .s di ip?

+0

Stai dividendo su qualsiasi carattere, quindi tutti i personaggi vengono suddivisi lasciando nulla nell'array. [string.split] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split (java.lang.String)) prende un'espressione regolare. – mellamokb

+4

Punto '.' significa" qualsiasi carattere ":) È necessario un" punto reale "' [.] ' – dasblinkenlight

+0

Per essere precisi, a seconda della modalità (DOTALL),' .' sarà o non corrisponderà al carattere della nuova linea. – nhahtdh

risposta

44

Utilizzare ip.split("\\."); ei problemi verranno risolti. Il problema è che String#split riceve un'espressione regolare, il simbolo punto (.) È un carattere speciale nelle espressioni regolari, quindi è necessario evitarlo perché venga interpretato come un punto chiaro, anche perché il backslash è un carattere di escape in Java , devi scappare anche tu.

+0

Va bene, grazie. Accetterò una volta che posso^_ ^ – CyanPrime

41

. è un carattere speciale nelle espressioni regolari, che è ciò che viene utilizzato per dividere una stringa.

Per aggirare questo, è necessario sfuggire allo .. Questo ci porta a \. Purtroppo, \ è anche un carattere speciale nella stringa di Java, in modo che deve anche essere sfuggito, per rendere \\.

Il nostro risultato "finale" è ip.split("\\.");

In un problema correlato, l'intera il processo può essere completamente evitato. Non ha senso fare qualcosa che una biblioteca standard ha già fatto per noi.

Si consideri il seguente

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

L'unico problema qui è da ricordare che, se si desidera che il valore int, è necessario estrarre con & come int octet = ipOctets[0] & 0xFF;

5

Pattern.quote(String) può essere utilizzato anche per citare il intera stringa. Ciò restituisce un modello che verrà interpretato letteralmente, i caratteri speciali non avranno alcun significato speciale. Questo potrebbe essere eccessivo in questo caso, ma a volte può essere utile.

Problemi correlati