java split 谢康_java使用split遇到的坑

使用split的时候,要多注意下标。

split方法

public String[] split(String regex) {

return split(regex, 0);

}

继续往里看:

public String[] split(String regex, int limit) {

//....

return Pattern.compile(regex).split(this, limit);

}

split()方法内部,其实是用Pattern去处理的。

Pattern是一个正则表达式经编译后的表现模式。

Pattern compile(String regex) 表示将给定的正则表达式编译并赋予给Pattern类。

Patter还有matcher()、find()、group()等方法。

而split(String regex, int limit),通过设置limit指定拆分成几部分。

如果只拆成两部分,如下:

String [] parts = str.split(",", 2);

使用split

split()的参数regex,是正则表达式。

比如,通过.去分隔:

String[] part=str.split("\\.");

通过,去分隔:

String[] part=str.split(",");

通过任意空格去分隔:

String[] part=str.split("\\s+");

数组下标越界

比如,以下方法,可能会出错:

public void splitError(String str) {

if (str == null) {

return;

}

String[] part = str.split(",");

String s0 = part[0];

String s1 = part[1];

}

假如str的分隔符后面没有数据,比如"a,",split拆分后的 String[]为{a}。

又或者str没有分隔符,比如"abc",split拆分后的 String[]为{abc}

明显part[1]会报错:java.lang.ArrayIndexOutOfBoundsException: 1。

因此,修改代码:

public void splitError(String str) {

if (str == null) {

return;

}

String[] part = str.split(",");

String s0 = part[0];

//添加以下判断

if (part.length > 1) {

String s1 = part[1];

}

}

下标为0,也可能会越界

看似没什么问题了,但是实际上还是可能出错。

假如str为"," ,那么split拆分后的 String[]为{},数组为空,因此part[0]会报错:java.lang.ArrayIndexOutOfBoundsException: 0。

修改代码:

public void splitError(String str) {

if (StringUtils.isEmpty(str)) {

return;

}

String[] part = str.split(",");

if (part.length == 1) {

String s0 = part[0];

} else if (part.length > 1) {

String s0 = part[0];

String s1 = part[1];

}

}

拆分前,先检查是否包含分隔字符

除了拆分之后,使用length判断下标。也可以在拆分之前,先检查是否包含分隔字符。

public void splitError(String str) {

if (StringUtils.isEmpty(str)) {

return;

}

if(str.contais(",")){

String[] part = str.split(",");

String s=part[0];

}

}

检查最后一个分隔符后是否有内容

《阿里巴巴java开发手册》上面有这样一条:

【推荐】使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无

内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。

说明:

String str = "a,b,c,,";

String[] ary = str.split(",");

// 预期大于 3,结果是 3

System.out.println(ary.length);

结论

记住,在使用split拆分字符串时,想获取字符串数组对应下标的数据,必须先判断数组长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值