2012-03-16 11 views
6

Jestem prawie pewna, że ​​odpowiedź brzmi "tak", ale chcę tylko potwierdzić, że nigdy nie ma sytuacji, w której łańcuch o wartości niezerowej (niezależnie od tego, co zawiera) zwróci cokolwiek innego niż poprawny ciąg jako pierwszy element tablicy zwracane przez split.jest zawsze bezpiecznie używać pierwszego elementu tablicy zwróconej przez split?

Innymi słowy.

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

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

moim rozumieniu jest to, że bar nie będzie zerowy, a linia przyporządkowanie nie ma sposobu na niepowodzenie. Jeśli separator nie zostanie znaleziony w ciągu znaków, po prostu zwraca foo w całości jako pierwszy element zwróconej tablicy.

+1

Jest to łatwe do sprawdzenia tego rodzaju zachowania, po prostu pisząc malutki program, który próbuje tej sprawy, i zobacz, co otrzymasz – mfrankli

+0

To jest. Nawet jeśli nie zawiera danego wyrażenia regularnego, zawsze zwróci ciąg intialny. –

+0

@mfrankli, Dzięki. To była prawie pomocna rada. Oczywiście mogę napisać program testowy (i mam) ... Pytam o jakiś możliwy warunek odstający, którego nie rozważałem ani nie myślałem. –

Odpowiedz

9

Nie,, It may fail

To nie ArrayIndexOutOfBound jeśli foo =","

+1

Dziwne, przypuszczam, że zwróci dwa puste ciągi i zapełni je jako [0] i [1]. Zdecydowanie +1, jeśli masz rację co do tego .. –

+0

Zapraszamy na pokaz połączonego kodu –

+0

+1 Bardzo dobry połów. –

1

(1) W przypadku foo bezpośredni pasuje do wzorca regex tablica zwrócone od split ma długość 0 i foo.split[0] wygeneruje ArrayIndexOutOfBoundsException.

(2) Należy pamiętać, że String.split może rzucić PatternSyntaxException, jeśli wyrażenie regularne jest niepoprawne w czasie wykonywania.

+0

to bardzo dobrze wiedzieć i dokładnie, dlaczego pomyślałem, że dobrze byłoby zapytać! :) –

+0

@ Dr.Dredel zweryfikował ostrzeżenie Jigara i zaktualizował. Ja też byłem zaskoczony. – paislee

+0

Proszę zobaczyć odpowiedź Jigara Joshi. –

1

Tak. pasek będzie równy ciągowi znaków ""

.split (",") próbuje podzielić po przecinku, ale w oryginalnym ciągu nie ma przecinka, , więc oryginalny ciąg zostanie zwrócony.

Co byłoby trudniejsze jest:

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

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

Tutaj sarray [0] powróci ArrayIndexOutOfBoundsException.

1

Oto zestaw testów dla Ciebie, że wykazanie powyższego:

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

Po uruchomieniu, to co można dostać:

$ 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

Nie ma potrzeby stosowania 'if (null == y)' w Javie, jeśli 'y' nie jest' boolean'. Po prostu użyj 'if (y == null)', ponieważ jest bardziej przejrzysty. –

Powiązane problemy