【问题标题】:When does String.split return an empty array?String.split 什么时候返回一个空数组?
【发布时间】:2015-03-18 02:50:39
【问题描述】:

我的日志显示此异常: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。我期待听到我缺少哪些明显的细节。

【问题讨论】:

  • docs.oracle.com/javase/7/docs/api/java/lang/… 看起来你找到了答案 :) 如果没有找到匹配项,它不会返回任何内容
  • ideone.com/jEiMFw " "(或分隔符* N " ..multiple spaces "
  • @thermite 我看到了那个文档,但我没有看到它提到特殊情况的地方。另外,使用 Selvin 的酷网站我们可以看到它是不正确的:ideone.com/8mRkd4
  • @Selvin 谢谢,就是这样。我有点惭愧我没有尝试过这个基本案例。添加了一个单元测试并休息一下。如果您愿意,可以将您的评论作为问题添加!
  • 不只是空格,即使字符串等于正则表达式,它也会返回空数组,例如,"a".split("a")ideone.com/YTGEsv

标签: java android


【解决方案1】:

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

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

(强调我的)

这意味着在类似代码的情况下

"ababaa".split("a")

一开始你会得到数组["", "b","b","",""],但后面的空字符串会被删除,所以你最终会得到数组["","b","b"]

但是如果你的字符串只包含 split 可以匹配它的模式的元素,比如

"ababab".split("ab")

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

所以要得到空数组,你需要分割字符串,它只包含可以被split参数匹配的子字符串,所以在split(" ")的情况下,原始字符串必须只从空格构建,并且它的长度必须至少为 1。

顺便说一句,如果原始字符串为空,例如 "",split(" ") 就不会发生,因此将返回带有原始字符串的数组,这意味着您仍然会得到带有一个元素的 [""] 数组,而不是空数组。

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

【讨论】:

    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2022-01-06
    • 2021-11-12
    相关资源
    最近更新 更多