только вход пользователя

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

  1. только будучи int
  2. между 1-30

Код, который я написал, работает только до определенного момента. Если вы введете что-то, что не является int, он проверит это и попросит вас ввести снова. Опять же, если вы продолжаете вводить что-либо, кроме int. У меня есть еще один цикл while, если он набирает int, и если он находится за пределами зоны 1-30, он попросит пользователя ввести снова. Однако после этого, если пользователь введет другое «что угодно, кроме int», программа выйдет из строя. Я пытался объединить условие sc.hasnextint() и проверку ввода между 1-30, но если я поставлю sc.nextint() перед sc.hasnextint() и пользователь введет что-либо, кроме int, программа вылетит. Если я поставлю его после цикла условия, то пользовательский ввод не будет объявлен.

int choose;
System.out.print("type an integer: ");
Scanner sc=new Scanner(System.in);

while (!sc.hasNextInt() ) { 
    System.out.println("only integers!: "); 
    sc.next(); // discard 
} 

choose=sc.nextInt();

while (choose<=0 || choose>30)
{
    System.out.print("no, 1-30: ");
    choose=sc.nextInt();
}
sc.close();

person BubbleTree    schedule 19.09.2012    source источник
comment
программа рухнет В каком смысле она рухнет? Возникает ли исключение, программа входит в бесконечный цикл while или происходит что-то совершенно другое?   -  person FThompson    schedule 19.09.2012
comment
Исключение в основном потоке java.util.InputMismatchException в java.util.Scanner.throwFor(неизвестный источник) в java.util.Scanner.next(неизвестный источник) в java.util.Scanner.nextInt(неизвестный источник) в java.util. Scanner.nextInt(неизвестный источник) на Main.main(Main.java:21)   -  person BubbleTree    schedule 19.09.2012
comment
То, как я делаю это в своей программе, не будет работать, поэтому я спрашиваю, знает ли кто-нибудь другой способ кодирования, чтобы заставить работать то, что я хочу. Например: введите целое число: gfgh только целые числа!: 43434 нет, 1-30: ffgg сбой   -  person BubbleTree    schedule 19.09.2012
comment
К сожалению, это самая важная часть информации, которую вы могли предоставить; добавьте его в сам вопрос. Что касается исправления, вы должны попытаться поймать свой вызов sc.nextInt(), а затем continue (предположительно существующий) охватывающий цикл.   -  person FThompson    schedule 19.09.2012


Ответы (2)


Вам нужно объединить два цикла, чтобы обе проверки происходили каждый раз, когда конечный пользователь вводит что-то новое:

for(;;) {
    if(!sc.hasNextInt() ) { 
        System.out.println("only integers!: "); 
        sc.next(); // discard
        continue;
    } 
    choose=sc.nextInt();
    if( choose<=0 || choose>30)
    {
        System.out.print("no, 1-30: ");
        continue;
    }
    break;
}

После выхода из цикла choose будет числом от 1 до 30 включительно.

person Sergey Kalinichenko    schedule 19.09.2012
comment
+1 за всегда истинный цикл for и отдельные условия if внутри него. - person asgs; 19.09.2012
comment
Основываясь на новой информации, предоставленной OP в комментарии, я бы сказал, что этот ответ не решит проблему, потому что sc.nextInt() не может анализировать нецелочисленные входные данные. - person FThompson; 19.09.2012
comment
@Vulcan Это нормально, потому что, в отличие от кода OP, этот не вызывает nextInt, если только hasNextInt не возвращает true. - person Sergey Kalinichenko; 19.09.2012
comment
Ах, я не заметил второй вызов nextInt в коде OP, мои извинения. - person FThompson; 19.09.2012

См. awnser dasblinkenlight с перехватом NumberFormatException. Я думал сделать это. Это тоже работает:

Вам нужно объединить две петли следующим образом:

while(true) {
if(!sc.hasNextInt) {
System.out.println("Only Integers!");
continue;
}
choose = sc.nextInt();
if(choose <= 0) {
System.out.println("The number you entered was too small.");
continue;
} else if(choose > 30) {
System.out.println("The number you entered was too large.\nMax: 30");
continue;
}
break;
}
sc.close();
person PrivateName    schedule 04.12.2013