所以,这可能是一个非常愚蠢的问题......但我只是不理解它。
我有String str = "AB"
,当我致电str.substring(2)
时,它不会生成索引超出范围的异常......它也不会返回任何内容,只是&# 34;",我想它应该......
但看到字符串" AB"长度为2,不表示最大指数是1吗?那么从2索引开始调用子字符串会产生IndexOutOfBoundsException
吗?当你拨打str.substring(3)
时,它会产生一个异常,它应该是,但不是2 ...这对我来说没有意义。
答案 0 :(得分:6)
According to the Javadoc,IndexOutOfBoundsException
只会被抛出......
...如果
beginIndex
为负数或大于此String对象的长度。
这意味着:由于"AB"
长度为2且beginIndex
为2,因为2不大于2,所以不会抛出IOOBE。您正确观察3将抛出IOOBE,因为3大于2。
还有助于记住substring
来自[n,m],其中m
是字符串的长度。如果n = m
,那么您将得到数学区间[m,m],by definition is the empty set。从此集合中生成空值将是正确行为。
答案 1 :(得分:5)
思考子字符串索引的一种方法是在字母之间。 0表示开头,2表示结尾。像:
/etc/init.d/*
每个索引选择其右侧的子字符串。在末尾有一个空子串,用索引2选择,因此有三种可能的结果:" AB"," B"和""。
答案 2 :(得分:1)
您可能会注意到:
String str = "AB";
str.substring(2);
根据javadoc有效,因为2
不大于"AB"
长度:
抛出:
IndexOutOfBoundsException - 如果beginIndex为负数或大于 这个String对象的长度。
我常常想到同样的问题,但这是一些JDK类依赖索引的方法
例如,ArrayList.add(int index, E element)
ArrayList.subList(int, int)
的工作方式也相同。
就好像这些方法在最后一个元素之后被认为是一个特殊的插槽。
在某些方法ArrayList.add(int index, E element)
中,有意义的是,当索引引用列表的大小时,它用于在列表的末尾添加元素。
例如:
List<String> list = ...
l.add(list.size(),lastElement);
这是表达它的单一方式,因为指定add(list.size()-1, element)
会在前一个位置添加元素。
但在substring(int)
案例中,用例不太明确,因为
String str = "AB",
String subStr = str.substring(2);
将始终返回""
。
但是,Java也是这样运作的。
答案 3 :(得分:0)
subString方法抛出异常 - 如果beginIndex为负数,或者endIndex大于此String对象的长度,或者beginIndex大于endIndex。
在您的情况下,您传递单个索引,并将其视为beginIndex 因此,只有当beginIndex为负或大于此String对象的长度时,它才会抛出IndexOutOfBoundsException。
在你的情况下,beginIndex是2,它不大于为什么你得到空子串的长度
答案 4 :(得分:-1)
理解的最佳方法是实际查看源代码(在方法中按ctrl +单击Intellij),这是自我解释的。当然也要看其他答案中提到的javadoc。
public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}
答案 5 :(得分:-3)
这是因为您的beginIndex
并非否定。
根据Java Doc:
抛出: IndexOutOfBoundsException - 如果beginIndex为负数,或者endIndex大于此String对象的长度,或者beginIndex大于endIndex。
如果设置参数:
str.substring(0, 2)
根据文档,它会抛出一个IndexOutOfBoundsException
。
检查:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int,%20int)