2012-07-12 8 views
23

Mam ten prosty kod:String.split powrocie NULL przy użyciu kropkę

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

I ipArray jest zerowa zanim natrafi System.out.println (rzuca wyjątku null pointer).

Moje pytanie brzmi: dlaczego ipArray ma wartość NULL, mimo że ustawiam go na rozdzielanie na każdym pliku IP?

+0

Dzielisz się na dowolną postać, więc wszystkie postacie są dzielone na nic nie pozostawiając w tablicy. [string.split] (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split (java.lang.String)) przyjmuje wyrażenie regularne. – mellamokb

+4

Kropka '.' oznacza" dowolny znak ":) Potrzebujesz" prawdziwej kropki "' [.] ' – dasblinkenlight

+0

Aby być dokładnym, w zależności od trybu (DOTALL),' .' będzie lub nie będzie pasować do nowego znaku. – nhahtdh

Odpowiedz

44

Użyj ip.split("\\.");, a Twoje problemy zostaną rozwiązane. Problem polega na tym, że String#split otrzymuje wyrażenie regularne, symbol kropki (.) Jest specjalnym znakiem w wyrażeniach regularnych, więc musisz go uciec, aby był interpretowany jako zwykła kropka, także jako ukośnik odwrotny jest znakiem escape w Javie , musisz też uciec.

+0

W porządku, dziękuję. Zgodzę się, gdy tylko będę mógł^_ ^ – CyanPrime

41

. to znak specjalny w wyrażeniach regularnych, który służy do dzielenia ciągu znaków.

Aby obejść ten problem, należy uciec przed numerem .. To prowadzi nas do \. niestety \ również specjalny znak w ciągu java, tak że musi być również uciekł, aby \\.

Nasz „ostateczne” Wynik jest ip.split("\\.");

w pokrewnej kwestii, całość proces można całkowicie uniknąć. Nie ma sensu robić czegoś, co standardowa biblioteka już dla nas zrobiła.

Rozważmy następujący

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

Jedynym problemem tutaj jest, aby pamiętać, że jeśli chcesz wartość int, trzeba wyodrębnić go z & jak int octet = ipOctets[0] & 0xFF;

5

Pattern.quote(String) mogą być również wykorzystywane zacytować cały ciąg. Zwraca wzór, który będzie interpretowany dosłownie, znaki specjalne nie będą miały specjalnego znaczenia. W tym przypadku może to być przesada, ale czasem może się przydać.

Powiązane problemy