【问题标题】:Why do I keep getting this indexing error?为什么我不断收到此索引错误?
【发布时间】:2019-05-13 17:50:06
【问题描述】:

我不断收到 StringIndexOutOfBoundsException。我正在尝试获取一个字符串并将每个字母替换为它后面的字母,然后返回新的操纵字符串。例如,“嘿”是“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)

【问题讨论】:

  • 顺便说一下我有零钱+=。
  • 确切的错误说:
  • 错误:线程“main”中的异常 java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:在 Main.LetterChanges(Main) 的 java.lang.String.charAt(String.java:658) 的 18 .java:11) 在 Main.main(Main.java:25)
  • change =+ str.charAt(i+1) + ""; 你的意思是把“+=”放在这里吗...?
  • @learning 最好将错误消息等信息放入问题本身,而不是使用“编辑”链接进行评论,因为这是您问题的一部分。

标签: java arrays loops indexing


【解决方案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();
}

【讨论】:

  • @DevilsHnd 它没有。
【解决方案2】:
  1. 如果 str 小于 26 (alpha.length) ,则 str.charAt(i) 会报错。
  2. alpha[i+1] ,如果 i 是 25 ,则 alpha[i+1] = alpha[26] 不存在并再次报错

【讨论】:

    【解决方案3】:
    private static String LetterChanges(String str) {
        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 < str.length() ; i++) {
            change = change.concat(Character.toString(getNextChar(str.charAt(i), alpha)));
        }
        return change;
    }
    
    private static char getNextChar(char eachChar, char[] alpha) {
        int charIndex = -1;
        for(int i = 0 ; i < alpha.length ; i++) {
            if(alpha[i] == eachChar) {
                charIndex = i;
                break;
            }
        }
        if(charIndex != -1) {
            //To handle the last indexed char 
            if(charIndex == alpha.length-1) {
                return alpha[0];
            } else {
                return alpha[charIndex+1];
            }
        }
        //default for unknown character
        return '-';
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 2021-11-28
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      相关资源
      最近更新 更多