java 拆分字符串后数组索引超出绑定异常

evrscar2  于 2023-04-19  发布在  Java
关注(0)|答案(2)|浏览(119)

splitting之后是一个字符串,如果index的最后一个值在那里,那么我不会得到任何exception

public class Digits {

    public static void main(String[] args) {
        String s = "123;456;;;777;000";
        String field[] = s.split(";");
        System.out.println(field.length);
        System.out.println(field[5]);
    }
}

输出为---〉s[5] = 000

public class Digits {

    public static void main(String[] args) {
        String s = "123;456;;;;";
        String field[] = s.split(";");
        System.out.println(field.length);
        System.out.println(field[5]);
    }
}

输出为----〉ArrayindexoutofBoundException

我期待null value,但它抛出错误。

myzjeezk

myzjeezk1#

如果使用替代方法,它将不会引发错误

String s = "123;456;;;;";
String field[] = s.split(";", -1);
System.out.println(field.length);
System.out.println(field[5]);

按单参数版本
因此,尾随的空字符串不包括在结果数组中。
但是,对于2参数版本
如果n是非正的,则模式将被尽可能多地应用

tzxcd3kk

tzxcd3kk2#

使用String field[] = s.split(";");时,实际调用方法为split(";",0)

public String[] split(String regex) {
    return split(regex, 0); 
 }

 // @param  regex : the delimiting regular expression
 // @param  limit : the result threshold, as described above
 public String[] split(String regex, int limit) {
    ...
 }

limit=0the trailing element of the result list is equal to 0时,方法split通过删除空元素来构造结果,如下所示:

// Construct result
int resultSize = list.size();
if (limit == 0) {
    while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
        resultSize--;
    }
}
String[] result = new String[resultSize];
return list.subList(0, resultSize).toArray(result);

这就是为什么s = "123;456;;;777;000"没有得到任何异常,但s = "123;456;;;;"得到ArrayindexoutofBoundException的原因。
总之,如果你想得到“”值,你可以assgin limit = -1 or other inegative number(假设你不想限制split的作用域),例如:

String field[] = s.split(";", -1);
String field[] = s.split(";", -2);

相关问题