2012-03-16 71 views
6

我很确定答案是肯定的,但我只是想确认,从来没有一种情况,非空字符串(不管它包含什么)会返回除了有效字符串之外的任何东西作为数组的第一个成员通过分割返回。使用split返回的数组的第一个元素总是安全的吗?

换句话说。

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

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

我的理解是,bar永远不会为空,分配行也无法失败。如果在字符串中找不到分隔符,它将返回整个foo作为返回数组的第一个元素。

+1

这很容易通过简单地写检查这种行为一个微小的程序,尝试这种情况下,看看你得到了什么 – mfrankli 2012-03-16 19:12:28

+0

它是。即使它不包含给定的正则表达式,它总是会返回初始字符串。 – 2012-03-16 19:12:46

+0

@mfrankli,谢谢。这几乎是有用的建议。很明显,我可以编写一个测试程序(并且有)...我正在询问一些我可能没有考虑或想到的异常情况。 – 2012-03-16 19:14:19

回答

9

不,It may fail

这将无法ArrayIndexOutOfBound如果foo =","

+1

奇数,我会假设它会返回两个空字符串并将它们填充为[0]和[1]。肯定+1,如果你是对的这个.. – 2012-03-16 19:18:08

+0

请访问链接代码演示 – 2012-03-16 19:18:57

+0

+1非常好的捕获。 – 2012-03-16 19:23:10

1

(1)如foo为正则表达式模式的直接匹配,该阵列从split返回具有长度0foo.split[0]将抛出ArrayIndexOutOfBoundsException。 (2)记住String.split如果正则表达式在运行时无效,则可能会抛出PatternSyntaxException

+0

这是非常好的知道,正是我为什么认为这将是很好的问! :) – 2012-03-16 19:15:29

+0

@ Dr.Dredel验证了Jigar的警告并已更新。我也很惊讶。 – paislee 2012-03-16 19:22:30

+0

请参阅Jigar Joshi的回答。 – 2012-03-16 19:22:47

1

是。 bar将等于字符串“”

.split(“,”)尝试在逗号后分割,但原始字符串中没有逗号,因此原始字符串将返回。

将是棘手的是:

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

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

这里sarray [0]会返回ArrayIndexOutOfBoundsException异常。

1

这儿有你的一套测试案例,证明上述:

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

运行时,这是你会得到什么:

$ 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

如果'y'不是'boolean',那么在Java中不需要'if(null == y)'。只要简单地使用'if(y == null)'就可以了。 – 2012-03-16 20:28:35