繁体   English   中英

为什么没有越界例外?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM