英文:
Getting array index out of bound exception after spliting a string
问题
在split
字符串后,如果索引的最后一个值存在,那么我就不会收到任何异常
。
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]);
}
}
输出为 ----> 数组索引越界异常
我期望得到null
值,但它抛出了错误。
英文:
After splitting
a string if last value of index is there then I am not getting any 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]);
}
}
Output is ---> 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]);
}
}
Output is----> ArrayindexoutofBoundException
I am expecting null value
but it is throwing error.
答案1
得分: 1
如果您使用替代方法,它不会抛出错误
String s = "123;456;;;;";
String field[] = s.split(";", -1);
System.out.println(field.length);
System.out.println(field[5]);
根据单参数版本
因此,尾随的空字符串不会包含在结果数组中。
但是使用两个参数的版本
如果n为非正数,则将尽可能多地应用模式。
英文:
If you use the alternative method, it will not throw an error
String s = "123;456;;;;";
String field[] = s.split(";", -1);
System.out.println(field.length);
System.out.println(field[5]);
As per the single parameter version
> Trailing empty strings are therefore not included in the resulting
> array.
However with the 2 parameter version
> If n is non-positive then the pattern will be applied as many times as possible
答案2
得分: -1
当你使用String field[] = s.split("";");
时,实际调用的方法是split("";"", 0)
。
public String[] split(String regex) {
return split(regex, 0);
}
// @param regex : 分隔正则表达式
// @param limit : 结果阈值,如上所述
public String[] split(String regex, int limit) {
// ...
}
当`limit=0`且`结果列表的尾元素等于0`时,`split`方法通过以下方式构造结果,移除空元素:
// 构造结果
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;;;;""`会引发ArrayIndexOutOfBoundsException的原因。
总之,如果你想得到`""`值,你可以赋值`limit = -1或其他负数`(只要你不想限制`split`的范围),例如:
```java
String field[] = s.split("";"", -1);
String field[] = s.split("";"", -2);
英文:
when you use String field[] = s.split(";");
, the actual calling method is 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) {
...
}
when limit=0
and the trailing element of the result list is equal to 0
, method split
constructs the result by removing the empty elements as follows:
// 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);
This is the reason for s = "123;456;;;777;000"
not getting any exception, but s = "123;456;;;;"
get ArrayindexoutofBoundException.
In conclusion, if you want get "" value, you can assgin limit = -1 or other inegative number
(Provided you don't want to limit the scope of the split
), for example:
String field[] = s.split(";", -1);
String field[] = s.split(";", -2);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论