Не могу найти причину моего исключения за пределы
Поэтому мне нужно написать метод, который позволяет мне находить следующее число, не используя ничего, кроме классов 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
,