为什么没有出界的例外?

时间:2014-09-16 11:06:57

标签: java string substring indexoutofboundsexception

我正在研究一个问题,该问题要求返回两个给定字符串包含相同长度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,7),即使字符串的最终索引是5.在以前的问题中,我似乎在类似的情况下产生了一个越界异常。为什么不在这里?所有人都非常感谢。

2 个答案:

答案 0 :(得分:1)

如果我们假设您使用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,因为i<len-1条件中的for;这样:

String bSub = b.substring(i, i+2);

=&GT; b.substring(4,6)=&gt; xxba az

如果您需要StringIndexOutOfBoundsException,请删除-1条件中的for

答案 1 :(得分:0)

正如你提到“在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