Java中的String.split方法是否可能返回一个空的String[]?

48

调用split方法是否可能返回一个空的String[]数组?我很好奇,因为我想尽可能在我的代码中进行保护而不必进行不必要的检查。以下是示例代码:

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

在我使用 splitting 后,我需要执行空值检查吗?

4个回答

58

它从不返回null。如果您不确定,应始终检查方法的javadoc。例如,String#split(String) 说:

此方法的工作方式类似于调用两个参数的split方法。

String#split(String,int)则表示:

如果表达式与输入的任何部分都不匹配,则生成的数组仅具有一个元素,即该字符串本身。

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


我已经查看了Javadoc,返回null!=抛出NPE。我看到它可能会抛出PatternException。 - Woot4Moo
7
split(String regex) 的 Javadoc 没有指明它不会返回 null。 - Paul
6
@Paul: 不,但是如果null可能会被返回,那么它(或者Pattern#split文档)会说明。而且单参数版本说它调用了双参数版本,双参数版本说:“如果表达式与输入的任何部分都不匹配,则生成的数组只有一个元素,即此字符串。” - T.J. Crowder

7
我建议您下载Java源代码,以便在API不清楚的情况下使用。这里的所有答案都会告诉您答案,但您真正应该自己看一看。您可以从这里(在页面底部附近查找)下载Java源代码。
通过跟踪源代码,您最终会到达String[] Pattern.split(CharSequence input, int limit)。返回值来自非空的ArrayList,在其中调用了toArraytoArray不会返回null:如果列表为空,则会返回一个空数组。
因此,最终的答案是,不需要检查null。

请参考 T.J. Crowder 在其他地方的评论。 - user207421

2
不需要在这些部件上检查空值。

1

Split方法调用Pattern.split方法,在方法的开头执行以下操作:

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

并在结尾处执行matchList.toArray()以返回一个数组。

因此不需要测试null值。


6
不要仅仅依赖代码实现来进行开发,因为代码实现是随时可能会发生变化的。文档是你所遵循的合同标准。 - T.J. Crowder
1
True。但是这个方法的实现不太可能改变,否则整个使用过这个方法而没有进行空值检查的Java世界都会陷入混乱。 - Varun Achar
1
在这种情况下,从文档中可以清楚地看出,如果它发生变化,它不能返回“null”。 - T.J. Crowder

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