找不到我出界的异常原因

时间:2014-01-13 11:11:11

标签: java stringbuffer

所以我需要编写一个方法,允许我在不使用String和StringBuffer类的情况下查找下一个数字(因此不需要解析或任何解析)。

当我运行我的代码时,除了最后一个输入(String k)之外,一切似乎都能正常工作。它会导致while循环中的outofbounds错误。但我不明白它是如何做到的,因为我的布尔值应该是假的(我认为因为它只包含九个)它不应该首先进入te循环。

public class Palindroom {
public static void main(String[] args) {
    // TODO Auto-generated method stub
      String s="347"
            + "";           System.out.println("s "+increment(s));
       String p="199919";System.out.println(" p "+increment(p));
       String d="199999";System.out.println( " d "+increment(d));
       String k ="999999";System.out.println(" k "+increment(k));

}

static String increment (String s) {
    StringBuffer sb = new StringBuffer (s);
    char laatst = sb.charAt(sb.length()-1);
    int laatste = sb.length()-1;

    if(laatst == '9') {
        int a = 1;
        boolean nine = false;
        for (int i = 0; i < sb.length(); i++) {
            if (sb.charAt(i) != 9 ) {
                nine = true;

            } else nine = false;
        }
        if (nine == true) {
            while (sb.charAt(sb.length()- a) == '9'){

                sb.setCharAt(sb.length()- a, '0' );

                a++;
            }
            sb.setCharAt(sb.length()-a, ((char)((sb.charAt(sb.length()-a)+1))));

        } else if( nine == false) {
            System.out.println("negen "+nine);
            sb.insert(0, '1');
            for (int i = 0; i < sb.length(); i++) {
                if(sb.charAt(i)=='9') {
                    sb.setCharAt(i, '0');
                }
            }
        }

    } else {
        sb.setCharAt(laatste,(char) (laatst+1) ); 
    }

    return sb.toString();
  }
}

2 个答案:

答案 0 :(得分:6)

编辑:基于评论:)。更正truefalse的逻辑。

 for (int i = 0; i < sb.length(); i++) {
            if (sb.charAt(i) == '9' ) {
                nine = true;

            } 
            else 
           {
               nine = false;
               break;
           }

        }

你也得到out of bounds exception,因为

while (sb.charAt(sb.length()- a) == '9'){

                sb.setCharAt(sb.length()- a, '0' );

                a++;
            }

在第五次迭代后,当控件检查条件时,sb.length()- a将为负。

在其他情况下你没有得到相同的错误,因为控件永远不会进入while循环(如nine == false

旧观察

in

if(laatst == '9') {
        int a = 1;
        boolean nine = false;
        for (int i = 0; i < sb.length(); i++) {
            if (sb.charAt(i) != 9 ) {
                nine = true;

            } else nine = false;
        }
你正在做什么

if (sb.charAt(i) != 9 ) {
                nine = true;

            } else nine = false;

相反,如果你想与角色9进行比较,

if (sb.charAt(i) != '9' ) {
            nine = true;

        } else nine = false;

否则您只是比较charAt(i)的ASCII值,因此boolean只有false,如果charAt(i)具有ascii值9

答案 1 :(得分:1)

问题是,当您的字符串仅包含9个字符时,您的while循环会导致a超过sb.length()。然后,您最终尝试访问sb的第-1位的字符。