String.split什么时候返回一个空数组?

时间:2015-01-20 00:18:45

标签: java android

我的日志显示此异常: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 个答案:

答案 0 :(得分:17)

split(regex)会返回split(regex,0) 0limit的结果。n现在根据documentation(限制由n表示)

  

如果"ababaa".split("a") 为零,那么模式将被应用尽可能多次,数组可以有任何长度,尾随空字符串将被丢弃

(强调我的)

这意味着如果像

这样的代码
["", "b","b","",""]

首先你将获得数组["","b","b"],但随后会删除空字符串swill,因此最终会得到数组split

但是如果你的字符串只包含"ababab".split("ab") 可以匹配其模式的元素,比如

["","","",""]

在第一个数组中将包含[](三个拆分),但随后将移除空尾随元素,这意味着将删除所有元素,这将留下split(大小为0的数组) )。

因此,为了获得空数组,你需要拆分只包含可以通过split(" ")参数匹配的子串的字符串,所以在split(" ")的情况下,原始字符串必须仅由空格构建,它的长度必须至少为1.

顺便说一句,如果原始字符串为空,就像“[""]那样不会发生,那么返回原始字符串的数组,这意味着你仍然会得到一个元素的{{1}}数组,而不是空数组。

你可以说“但你说删除尾随空字符串,那么为什么不删除这个”(它是尾随的,它是空的)?“。是的,但删除尾随的空字符串只有在这些字符串由于拆分而创建时才有意义,所以如果没有发生拆分,则不需要“清理”,因此结果数组将包含原始字符串as在我的earlier answer中解释了这个问题。