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
的非空 ArrayList
。 toArray
不返回 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有啥区别?