Java如何避免字符串索引超出范围

时间:2018-08-29 09:12:52

标签: java string stringindexoutofbounds

我要执行以下任务:

  

如果字符串“ cat”和“ dog”出现相同的数字,则返回true   给定字符串中的次数。

     

catDog(“ catdog”)→true catDog(“ catcat”)→false   catDog(“ 1cat1cadodog”)→true

我的代码:

public boolean catDog(String str) {
int catC = 0;
int dogC = 0;
if(str.length() < 3) return true;
for(int i = 0; i < str.length(); i++){
   if(str.charAt(i) == 'd' && str.charAt(i+1) == 'o' && str.charAt(i+2)  == 'g'){
     dogC++;
   }else if(str.charAt(i) == 'c' && str.charAt(i+1) == 'a' && 
                                       str.charAt(i+2) == 't'){
    catC++;
  }
}

if(catC == dogC) return true;
return false;
}

但是对于catDog("catxdogxdogxca")false,我得到了StringIndexOutOfBoundsException。我知道它是由if子句在尝试检查charAt(i+2)是否等于t时引起的。如何避免这种情况? 谢谢你:)

2 个答案:

答案 0 :(得分:2)

for(int i = 0; i < str.length(); i++){ // you problem lies here
   if(str.charAt(i) == 'd' && str.charAt(i+1) == 'o' && str.charAt(i+2)  == 'g')

您正在使用i < str.length()作为循环终止条件,但是您正在使用str.charAt(i+1)str.charAt(i+2)

由于您需要访问 i+2 ,因此您应该将范围限制为 i < str.length() - 2

for(int i = 0, len = str.length - 2; i < len; i++) 
// avoid calculating each time by using len in initialising phase;

答案 1 :(得分:0)

逻辑存在问题,条件语句试图访问超出字符串大小的字符。

输入: catxdogxdogxca 在结尾处具有 ca ,这就是执行 else 块并试图使字符出现在i + 3上的原因。输入中不存在。这就是为什么您看到 java.lang.StringIndexOutOfBoundsException