我的日志显示此异常:ArrayIndexOutOfBoundsException: length=0; index=0由以下代码触发:
ArrayIndexOutOfBoundsException: length=0; index=0
public static String getInitialsFromFullName(String fullName) { String[] splitNames = fullName.split(" "); String firstName = splitNames[0]; <-- Here ... }
我试图弄清楚String.split返回空数组的条件。我的理解是,如果找不到匹配项,则返回大小为1且与原始字符串匹配的数组。
这是为Android build SDK版本21编译的Java。我期待听到我遗漏的明显细节。
split(regex)返回结果的split(regex,0)地方0是limit。现在根据文档(限制由表示n)
split(regex)
split(regex,0)
0
limit
n
如果n为零,则将尽可能多地应用该模式,该数组可以具有任何长度,并且 尾随的空字符串将被丢弃 。
(强调我的)
这意味着在类似
"ababaa".split("a")
首先,您将获得数组,["", "b","b","",""]但随后的空字符串将被删除,因此您将获得数组["","b","b"]
["", "b","b","",""]
["","b","b"]
但是,如果您的字符串仅包含split可以与其模式匹配的元素,例如
split
"ababab".split("ab")
首先,数组将包含["","","",""](三个分割),但随后将删除空的尾随元素,这意味着将删除所有元素,这将使您拥有[](大小为0的数组)。
["","","",""]
[]
因此,要获得空数组,您需要分割仅包含可通过split参数匹配的子字符串的字符串,因此,如果split(" ")原始字符串必须仅由空格构建,并且其长度必须至少为1。
split(" ")
顺便说一句,如果原始字符串不会像“”那样为空,split("")那么将返回具有原始字符串的数组,这意味着您仍将获得[""]具有一个元素的数组,而不是空数组。
split("")
[""]
你可以说:“ 但你说的是,后空字符串被删除,为什么这个‘’不删除(这是落后的,也是空的)? ”。是的,但是仅当_这些字符串作为splitting结果创建时_ ,删除尾随的空字符串才有意义,因此,如果未发生split,则不需要“ cleanup”,因此result数组将包含原始字符串,如我之前对此的解释学科。