为什么split函数在java中表现得像这样?

时间:2011-10-05 13:30:04

标签: java

如果我这样做的话

    String a = ""
    String b = a.split(" ")[0];

它没有给出ArrayIndexOutOfBoundException

但是当我这样做的时候

    String a = " "
    String b = a.split(" ")[0];

它给了我ArrayIndexOutOfBoundException

当我这样做时

    String a = " abc"
    String b = a.split(" ")[0];

它没有给我例外 为什么这样?

5 个答案:

答案 0 :(得分:3)

有点奇怪。

事情是,在你的第一个例子中,空字符串“”是一个字符串,而不是null。因此,当您说:使用标记“”拆分此“”时,模式不匹配,并且您获得的数组是原始字符串。就像你做的那样

String a = "abc";
String b = a.split(" ")[0];

要拆分的模式不匹配,因此您将获得一个标记,即原始字符串。

你在第二种情况下得到一个例外,因为你的String的COMPLETE内容正好是你传递给分割的分隔符,所以你最终得到一个空数组。

如果您想了解更多细节,请告诉我,但这就是它。

答案 1 :(得分:2)

后:

String a = " "
String[] arr = a.split(" "); 

arr是一个空数组。这就是为什么当你试图访问它的第一个(和不存在的)元素时它会抛出ArrayIndexOutOfBoundsException。现在,之后:

String a = " abc"
String[] arr = a.split(" ");

arr有一个元素:"abc",这就是当您尝试访问其第一个元素时不会抛出异常的原因。

答案 2 :(得分:2)

案例#1

String a = ""
String b = a.split(" ")[0];

来自Javadoc

  

如果表达式与输入的任何部分都不匹配,那么   结果数组只有一个元素,即这个字符串。

所以split()给你一个单元素数组,由输入字符串("")组成。因此也不例外。

案例#2

String a = " "
String b = a.split(" ")[0];

来自Javadoc

  

因此,结果中不包括尾随空字符串   阵列。

你有两个这样的尾随空字符串,没有别的。因此,您将返回零大小的数组,从而导致异常。

案例#3

String a = " abc"
String b = a.split(" ")[0];

这不是一个极端的案例,因为它显然必须返回至少一个元素,因此也不例外。

答案 3 :(得分:1)

  

字符串a =“”;

     

字符串b = a.split(“”)[0];

执行此操作时,由于不存在“split”字符,因此不执行拆分操作,并返回一个数组,其中first和only元素为空字符串。

  

字符串a =“”;

     

字符串b = a.split(“”)[0];

虽然在这种情况下它会尝试拆分字符串,但不会在任何一侧放置任何值,因此不会创建任何数组。因此,当您尝试访问其第0个元素时,它会给出ArrayOutOfBoundException。

  

字符串a =“abc”;

     

字符串b = a.split(“”)[0];

在这种情况下,分裂发生并且“abc”被放置在第0位(我猜)并且你留下了一个大小大于0的数组。问题解决了!! ..

答案 4 :(得分:0)

如果提供的String.split()

完全匹配,regex总是有可能返回一个空数组