Не могу найти причину моего исключения за пределы

Поэтому мне нужно написать метод, который позволяет мне находить следующее число, не используя ничего, кроме классов String и StringBuffer (так что нет разбора или чего бы то ни было).

когда я запускаю свой код, кажется, что все работает нормально, за исключением последнего ввода (строка k). Это вызывает ошибку outofbounds в цикле while. Но я не понимаю, как это могло бы сделать это, потому что, поскольку мой логический тип должен быть ложным (я думаю, потому что он состоит только из девяти), он не должен входить в цикл в первую очередь.

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 ответа

Решение

РЕДАКТИРОВАТЬ: на основе комментариев:) . Исправьте свою логику для true а также false,

 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)

СТАРЫЕ НАБЛЮДЕНИЯ

в

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;

в противном случае вы просто сравниваете значение ASCII charAt(i) и так твой boolean будет только false, если charAt(i) имеет значение ASCII 9

Проблема в том, что когда ваша строка состоит только из 9, ваш while причин цикла a превышать sb.length(), Затем вы пытаетесь получить доступ к персонажу в месте -1 sb,

Другие вопросы по тегам