Java报错系列——split

简介:

前言

在Java项目中,比如我们经常使用String的split方法对文本进行处理;在Map/Reduce中,我们也需要对HDFS文件读取后对line进行分割,也涉及到split。前几天,本来“好好的”程序,突然在split处报错,后来才知道由于有一条“脏数据”导致split“超出”了预期,才导致了“不可能发生的异常”就这样发生了~不过也说明了一些基础知识真的很重要,于是把String类的split源码阅读了下,发现一个“小小的”split也挺多内容的。


String中的split

在String中,split方法如下:


wKiom1V5V4vB-UifAABPIVl1KsA500.jpg


wKioL1V5WTKw1LVgAABipXk0ufk248.jpg

可见,split的核心在于Pattern.compile(regex).split(this, limit);


Java提供Pattern,Matcher用于支持正则,可以看一个例子:


wKiom1V5WHjQ18udAAEmAHAt7yY052.jpg


运行结果是:

0,1

||

3,4

|ab|

7,8

|cef|

8,9

||

11,12

|kk|

13,14

|a|


需要注意的是:


通过Pattern给定一个模式(regex),Matcher可以不断(find)匹配文本,并能找到每

一个匹配上的内容的开始(start),结束(end)索引【结束索引说白了,就是start+匹配

文本的长度】。


subSequence(begin,end)是一个“包头不包尾”的方法



问题:

在上面的while中,我们能到达的最大的索引处,就是最后一个end,而注意到很有可能

这个end之后还有内容,那么该如何处理呢?

如果一个正则将文本split成了几部分,我们只需要一部分呢?

如果分成的部分中有“”空字符串,split又是如何处理的?



我们可以带着这些问题来看看源码:


wKioL1V5XurQ1CqfAAJMp4wDURg874.jpg


wKioL1V5Yt3QNxZ5AAIHWzkZ2QE768.jpg


首先来看,limit对matchLimited的影响:


limit < 0 或者 split(regex)等价于split(regex,0)  ==>  matchLimited:false

limit > 0                           ==>  matchLimited:true



其实,while的意思就是说,如果limit>0的话,matchList只加入有限的内容。

如果整个文本没有匹配上,那么返回一个长度为1,内容为其本身的数组。

如果limit为0,那么会将最后匹配的那些空串删除掉直至非空串为止在返回结果。




结论

在实际应用中,我们一般使用这样的:

str.split(",")    此时limit=0,只需要注意会去掉最后的空串即可 

str.split(",",-1)  此时会保留最后的空串

str.split(",",2)   限制匹配的个数,同时保留最后的空串


本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1661091,如需转载请自行联系原作者


相关文章
|
3月前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
120 4
|
29天前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
41 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
1月前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
1月前
|
安全 小程序 Java
Java“AccessControlException”报错解决
Java中的“AccessControlException”通常发生在尝试访问受安全策略限制的资源时。解决方法包括:1. 检查安全策略文件(java.policy)配置;2. 确保代码具有足够的权限;3. 调整JVM启动参数以放宽安全限制。
140 1
|
3月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
49 5
|
3月前
|
域名解析 分布式计算 网络协议
java遍历hdfs路径信息,报错EOFException
java遍历hdfs路径信息,报错EOFException
42 3
|
3月前
|
缓存 Java Linux
java操作hbase报错:KeeperErrorCode=NoNode for /hbase-unsecure/master
java操作hbase报错:KeeperErrorCode=NoNode for /hbase-unsecure/master
210 2
|
3月前
|
Java
java服务调用报错503
java服务调用报错503
36 2
|
3月前
|
JSON Java 数据格式
java调用服务报错400
java调用服务报错400
73 2
|
3月前
|
JSON Java 数据格式
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
105 1
下一篇
DataWorks