什么情况下会导致String.split返回一个空数组?

15

我的日志显示了这个异常:ArrayIndexOutOfBoundsException: length=0; index=0,由以下代码触发:

public static String getInitialsFromFullName(String fullName)
{
    String[] splitNames = fullName.split(" ");
    String firstName = splitNames[0]; <-- Here
    ...
}

我正在尝试找出导致String.split返回空数组的条件。我的理解是,如果没有找到匹配项,则会返回一个大小为1且包含原始字符串的数组。

这是针对Android构建SDK版本21编译的Java。我期待着听到我遗漏了什么明显的细节。


1
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String) 看起来你找到了答案 :) 如果没有匹配,它将返回空。 - thermite
2
如果fullName是分隔符“ ”(或分隔符*N“ ..多个空格 ”)http://ideone.com/jEiMFw - Selvin
不仅是空格,即使字符串与正则表达式相等,它也会返回一个空数组,例如:"a".split("a") http://ideone.com/YTGEsv - srkavin
空格只是一个例子,因为它在某个 OP 的代码中被使用...我写了“fullName is separator”或“separator * N”... - Selvin
当你忘记了 split 需要一个完整的正则表达式而不仅仅是一个字符串时,请小心,因为我曾尝试使用点号来分割文件名,但我需要提供模式 "\\。" 而不是 "." 才能使其工作;否则它将匹配 一切 并返回一个空数组。 - klaar
显示剩余2条评论
1个回答

28
split(regex, 0)返回split(regex)的结果,其中0limit。根据文档n表示limit):

如果n为零,则模式将被尽可能多次地应用,数组可以具有任何长度,并且尾随空字符串将被丢弃

这意味着,在类似以下的代码中:

"ababaa".split("a")

一开始你会得到数组 ["", "b","b","",""],但是接下来尾部的空字符串将被移除,因此最终你会得到数组 ["","b","b"]

但是如果你的字符串包含可以完全匹配 split 模式的文本,例如:

"ababab".split("ab")

最初的结果数组将包含["","","",""](三个分割),但是然后空的尾随字符串将被删除。由于它们都是尾随的空字符串,因此将它们全部从数组中删除,并返回一个空数组[](大小为0的数组)。

因此,要获得空数组作为结果,您需要在可以与split模式匹配的部分构建的字符串上进行拆分。这意味着在yourString.split(" ")的情况下,yourString必须只包含空格(至少一个,请参见BTW获取更多信息)。


顺便说一句,如果原始字符串为空"",并且我们调用"".split("any-value"),则不会进行拆分(拆分什么也没有没有意义)。在这种情况下,包含原始字符串[""]的数组将被返回,并且该空字符串将不会被删除,因为它不是拆分的结果

换句话说,只有当这些空字符串是作为拆分结果创建的时,删除尾随空字符串才有意义,例如"abaa".split("a")最初创建["","b", "",""]。因此,当没有发生拆分时,“清理”不是必需的。在这种情况下,结果数组将包含原始字符串,如我在此主题上的早期答案中所解释的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接