[英]Why no out of bounds exception?
我正在看一个问题,要求返回两个给定字符串包含相同长度2子字符串的位置数。 因此,“ xxcaazz”和“ xxbaaz”产生3,因为“ xx”,“ aa”和“ az”子字符串在两个字符串中的相同位置出现。 据说解决方法如下:
public int stringMatch(String a, String b) {
// Figure which string is shorter.
int len = Math.min(a.length(), b.length());
int count = 0;
// Look at both substrings starting at i
for (int i=0; i<len-1; i++) {
String aSub = a.substring(i, i+2);
String bSub = b.substring(i, i+2);
if (aSub.equals(bSub)) { // Use .equals() with strings
count++;
}
}
return count;
}
我不明白为什么这个解决方案没有例外。 例如,如果有两个字符串分别以长度6和7输入,则在for循环的最终迭代中,i = 5。 但是,对于较小的字符串的子字符串,即使字符串的最终索引为5,给出的参数也将是(5,7)。在以前的问题中,在类似情况下,我似乎产生了超出范围的异常。 为什么不在这里? 所有帮助,不胜感激。
如果我们假设您使用Java进行编码,则在substring(int beginIndex, int endIndex)
, endIndex
是排他的。
从http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#substring-int-int- :
参数:
beginIndex
起始索引(含)。
endIndex
结束索引(不包括)。
因此,当您调用最后一个缩进时, i
等于4,因为在for
条件下i<len-1
; 所以:
String bSub = b.substring(i, i+2);
=> b.substring(4,6)=> xxba az
如果需要StringIndexOutOfBoundsException
,则将for
条件中的-1
删除。
正如您提到的“ 在for循环的最终迭代中,i = 5 ”。 在第5次迭代中,i = 4从第0个索引开始。 所以输出是
0> xx == xx
1> xc == xb
2> ca == ba
3> aa == aa
4> az == az
对于substring函数,第二个参数不包含在内,因此substring(4,6)永远不会尝试读取索引6。因此,程序不会导致IndexOutOfBoundsException 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.