的StringIndexOutOfBoundsException

时间:2014-01-27 16:55:45

标签: java

我制作了一个应该清理String的方法。它必须删除覆盖范围为[a,z]的每个字符。

但是我得到了这个例外:StringIndexOutOfBoundsException。 当我插入一个超出条件范围的数字时,会弹出此异常。 我无法发现我做错了什么。

    public static String kuisStringOp(String str){
        StringBuilder strb = new StringBuilder(str);

        for (int i = 0; i < str.length(); i++) {
            if(strb.charAt(i)<'a'||strb.charAt(i)>'z'){

                strb.deleteCharAt(i);


            } 

        }           
        return strb.toString(); 
    }

4 个答案:

答案 0 :(得分:4)

您正在浏览原始字符串的整个长度,但是您要删除StringBuilder中的某些字符。删除字符后,StringBuilder比原始String短,内容已移至覆盖已删除的字符。在到达原始StringBuilder的末尾之前,您最终会在String的末尾结束。

更改for循环条件以检查StringBuilder的长度,如果删除了某个字符,则另一个字符现在就位。通过递减i

再次检查
for (int i = 0; i < strb.length(); i++) {
    if(strb.charAt(i)<'a'||strb.charAt(i)>'z'){
        strb.deleteCharAt(i);
        i--;
    } 

}       

答案 1 :(得分:1)

如果您要循环str但要从strb删除,则需要执行 保留两个索引/指针,一个到str,一个到strb

试试这个。

public class Test015 {
    public static void main(String a[]) throws Exception {
        String z = "111aaaa2222bbb";
        System.out.println(kuisStringOp(z));
    }

    public static String kuisStringOp(String str){
        StringBuilder strb = new StringBuilder(str);
        int i = 0;
        int j = 0;

        for (i = 0; i < str.length(); i++) {
            if(strb.charAt(j)<'a'||strb.charAt(j)>'z'){
                strb.deleteCharAt(j);
            }else{
                j++;
            }
        }           
        return strb.toString(); 
    }

}

答案 2 :(得分:1)

使用

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

就删除缓冲区中的字符而言,您需要在下一次迭代之前检查其长度。

答案 3 :(得分:0)

你正在改变字符串,同时你正在迭代它......

Regex.Replace会做出更清晰的解决方案,如下所示:

Regex.Replace(input, "[a-z]", "");