为什么这不会生成IndexOutOfBoundsException?

Luk*_*ite -1 java string indexing

所以,这可能是一个非常愚蠢的问题......但我只是不理解它.

我有一个String str = "AB",当我调用str.substring(2)它时不会生成索引超出范围的异常...它也不会返回任何内容,只是"",我想它应该...

但是看到字符串"AB"的长度为2,这是不是意味着最大索引是1?所以不会调用从2索引开始的子串生成IndexOutOfBoundsException?它会在你打电话时产生一个异常str.substring(3),它应该是,但不是2 ...这对我来说没有意义.

Mak*_*oto 6

根据Javadoc的说法,IndexOutOfBoundsException它只会被抛出......

...如果beginIndex为负或大于此String对象的长度.

转换为:由于"AB"长度为2且beginIndex为2,因为2不大于2 ,所以不会抛出IOOBE .您正确地观察到3将抛出IOOBE,因为3大于2.

它还有助于记住substring从[n,m)开始,其中m是字符串的长度.如果n = m,则导致数学区间[m,m),根据定义,它是空集.从此集合生成空值将是正确的行为.


fgb*_*fgb 5

思考子串索引的一种方法是在字母之间.0表示开头,2表示结尾.喜欢:

|  A  |  B  |
0     1     2
Run Code Online (Sandbox Code Playgroud)

每个索引选择其右侧的子字符串.在末尾有一个空子串,用索引2选择,因此有三种可能的结果:"AB","B"和"".