Java String.split 是不是有可能返回 null String[]

Posted

技术标签:

【中文标题】Java String.split 是不是有可能返回 null String[]【英文标题】:Is it possible that Java String.split can return a null String[]Java String.split 是否有可能返回 null String[] 【发布时间】:2011-08-01 17:26:27 【问题描述】:

split 是否可以返回 null String[]?我很好奇,因为我想尝试在我的代码中尽可能地进行防御,而无需进行不必要的检查。代码如下:

String[] parts = myString.split("\\w");  

在使用parts 后拆分之前是否需要执行空检查?

【问题讨论】:

【参考方案1】:

它永远不会返回 null。如果您不确定,您应该始终检查该方法的 javadoc。例如String#split(String)

这个方法的工作原理就像调用两个参数的split 方法

...和String#split(String,int) 说:

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

您还可以从 Javadoc 中找出可能发生的异常类型,更重要的是,为什么会抛出这些异常。另外要检查的一件非常重要的事情是这些类是否是线程安全的。

【讨论】:

我确实检查了 javadoc,返回 null != throwing NPE。我看到了它可以抛出的 PatternException。 split(String regex) 的 Javadoc 并不表示不能返回 null。 @Paul:不,但如果null 可以返回,它(或Pattern#split 文档)会这样说。而单参数表示它调用的双参数版本表示 “如果表达式与输入的任何部分都不匹配,则结果数组只有一个元素,即这个字符串。” 【参考方案2】:

我建议您在 API 不清楚的时候下载 Java 源代码。这里的所有答案都只是告诉你答案,但你应该自己看看。您可以从here 下载 Java 源代码(查看页面底部附近)。

按照源代码,您最终会到达String[] Pattern.split(CharSequence input, int limit)。返回值来自调用 toArray 的非空 ArrayListtoArray 不返回 null:如果列表为空,您将返回一个空数组。

所以最后,不,您不必检查 null。

【讨论】:

见 T.J.克劳德在别处的评论。【参考方案3】:

不,您不需要检查零件是否为空。

【讨论】:

【参考方案4】:

Split 方法调用 Patter.split 方法,该方法在方法的开头执行此操作:

ArrayList<String> matchList = new ArrayList<String>();

最后执行 matchList.toArray() 返回一个数组。

所以不需要测试空值。

【讨论】:

永远不要依赖于查看实现。实施可以改变。文档就是您正在遵守的合同。 是的..但是这个方法的实现不太可能改变,或者整个使用这个方法而没有进行空检查的java世界将陷入混乱。 在这种情况下,从文档中可以清楚地看出,如果它发生变化,它一定不能返回null

以上是关于Java String.split 是不是有可能返回 null String[]的主要内容,如果未能解决你的问题,请参考以下文章

[Java]_[初级]_[高效使用String.split的方法]

[Java]_[初级]_[高效使用String.split的方法]

Java, Stringtokenizer和String split有啥区别?

。。。Java String.split()函数的用法分析。。。

java String.split()函数的用法分析

|在 java string.split() 方法中无法识别[重复]