2015-07-22 10 views
1

Я относительный новичок в Java и у меня проблема с пользовательским циклом do-while, который принимает ввод пользователя для повторения. Вот код в конце цикла.StringIndexOutOFBoundsException: 0

System.out.print("Do you wish to continue? (Y for yes " + 
          "/ N for no)"); 
     input = keyboard.nextLine(); 
     input.length(); 
     repeat = input.charAt(0); 

     }while (repeat == 'Y' | repeat == 'y'); 

Я знаю, что это бросает исключение из стоимости, но не могу понять, что нужно сделать, чтобы исправить это, так как я уверен, что это относительно просто. Спасибо за помощь.

Edit 1: StackTrace:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 0 
at java.lang.String.charAt(Unknown Source) 
at FractionTest.main(FractionTest.java:59) 
+1

Похоже, вы читаете пустую строку. – Pshemo

+0

Извините, что я вышел из stacktrace. Вот он: Исключение в потоке «main» java.lang.StringIndexOutOfBoundsException: Индекс строки за пределами диапазона: 0 \t at java.lang.String.charAt (Неизвестный источник) \t at FractionTest.main (FractionTest.java:59) – Steve

+0

Возможный дубликат [IndexOutOfBoundsException при вводе символа от пользователя] (http://stackoverflow.com/questions/27619851/indexoutofboundsexception-when-taking-character-input-from-the-user) – naXa

ответ

1

Похоже, что вы читали пустую строку, возвращающий вам пустую строку "" так нет символов там (даже не 0th).

Это обычно происходит, когда вы используете nextLine сразу после других методов, таких как nextABCnextInt поскольку такие методы не потребляют разделители строк и nextLine читает текст до следующего разделителя строки (или в конце потока).

В этом случае вы можете добавить nextLine после этого nextInt, чтобы потреблять разделитель линий.

Во всяком случае, чтобы избежать чтения символа из пустой строки и исключения вы можете использовать что-то вроде

} while (input.toLowerCase().startsWith("y")); 

вместо

input.length();//this actually doesn't change anything, you can remove it 
    repeat = input.charAt(0); 

} while (repeat == 'Y' | repeat == 'y'); 
+0

Я добавил приведенный выше оператор if, и он все еще бросает одно и то же исключение. – Steve

+0

@Steve Я обновил свой ответ, чтобы добавить альтернативный способ пропустить эту ошибку и вероятную причину получения пустой строки. – Pshemo

1

Как @Phesmo упоминалось вы можете получать 0 длины линии а. Это неясная проблема. Вы звонили nextInt(), nextLong(), nextShort(), nextByte(), или nextBoolean() на сканер перед вызовом nextLine()?


Попробуйте

System.out.print("Do you wish to continue? (Y for yes/N for no)"); 

char ans; 
do { 
    ans = keyboard.next().charAt(0); 
    // filter input 
} while (ans == 'Y' || ans == 'y' || ans == 'N' || ans == 'n'); 

repeat = ans; 

} while (repeat == 'Y' | repeat == 'y'); 

От documentation:

String Scanner#next()
Находит и возвращает следующий полный маркер из этого сканера. Перед первым токеном предшествует ввод, соответствующий шаблону разделителя.

Или это

System.out.print("Do you wish to continue? (Y for yes/N for no)");  
repeat = keyboard.next("[YyNn]").charAt(0); 

} while (repeat == 'Y' | repeat == 'y'); 

documentation От:

String Scanner#next(String pattern)
Возвращает следующий токен, если он соответствует шаблону, построенный из указанной строки.

"[YyNn]" является шаблоном класса символов, это означает любой символ из набора.

+0

++ для идеи использования 'next' вместо' nextLine' (но вы могли бы добавить дополнительную информацию о том, почему вы хотели использовать его здесь) – Pshemo

+0

Исправлена ​​проблема с исключением. Спасибо naXa. Я никогда не видел этот формат для входного аргумента, чтобы охватить все возможные входы. – Steve

+0

@Steve, это расширенная тема. Если вы хотите узнать больше, читайте о регулярных выражениях. – naXa

Смежные вопросы