为什么我不断收到这个索引错误?

时间:2019-05-13 17:50:06

标签: java arrays loops indexing

我一直在获取StringIndexOutOfBoundsException。我正在尝试获取一个String并将每个字母替换为其后的一个字母,然后返回新的可操纵String。例如,“嘿”是“ Ifz”。

我尝试更改索引,但是没有任何作用。

String change = "";
char[] alpha =  {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};


 for(int i = 0; i < alpha.length; i++) {

    if(str.charAt(i) == alpha[i]) {
        change += alpha[i+1] + "";
    }


    }

    return change;

  } 

  public static void main (String[] args) {  
    // keep this function call here     
    Scanner s = new Scanner(System.in);
    System.out.print(LetterChanges(s.nextLine())); 
  }   

 Error Message:

 Exception in thread "main" java.lang.StringIndexOutOfBoundsException:    

String index out of range: 18
at java.lang.String.charAt(String.java:658)
at Main.LetterChanges(Main.java:11)
at Main.main(Main.java:25)

3 个答案:

答案 0 :(得分:1)

问题是str的长度可能小于26(当您遍历列表alpha时),因此str.charAt(i)将引发异常。如果您的字符串保证只包含ASCII字母,那么一种实现方式是:

String getChange(String str){
     StringBuilder change = new StringBuilder();
     for (int i = 0; i < str.length(); i++){
        char c = str.charAt(i);
        int nextCharPos ;
        if ('a' <= c && c <= 'z')
            nextCharPos = ((int) ('a')) + ((c - 'a') + 1) % 26;
        else if ('A' <= c && c <= 'Z')
            nextCharPos = ((int) ('A')) + ((c - 'A') + 1) % 26;
        else {
            change.append(c);
            continue;
        }
        char nextChar = (char)(nextCharPos);
        change.append(nextChar);
     }
     return change.toString();
}

答案 1 :(得分:0)

  1. 如果str小于26(alpha.length),则str.charAt(i)将给出错误消息。
  2. alpha [i + 1],如果i为25,则alpha [i + 1] = alpha [26]不存在,并再次给出错误

答案 2 :(得分:0)

statistic=0.459, pvalue=0.0

此代码将输入字符串限制为alpha数组元素,并且数组之外的任何内容均默认为'-'。该代码还将循环元素,即输入中的“ z”将替换为“ a”。