Делай - пока идет бесконечный цикл - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь добавить проверку ввода в это меню. Когда пользователь вводит, например: «a» или любой ввод, который не является целым числом и с заданным диапазоном, он должен выполнить блок catch и l oop снова, чтобы предложить пользователю ввести снова, но вместо этого он продолжает бесконечно повторяться после получения вход один раз. Таким образом, он начинается с выполнения меню и просто пропускает часть ввода и выполняет блок catch.

Редактировать: он переходит в бесконечное число l oop, если я ввожу что-либо, что не является целым числом.

Scanner sc = new    Scanner(System.in);

int x = 1;

do{

try

{

System.out.println("Select option ");

System.out.println("1) Circle ");

System.out.println("2) Rectangle ");

System.out.println("3) Triangle ");

System.out.println("4) Exit ");

x = sc.nextInt();

}

catch(Exception e)

{

System.out.print("Invalid data");

}

}while(x<1 || x>4);

Ответы [ 2 ]

1 голос
/ 01 февраля 2020

Проблема в том, что вы не очищаете буфер, когда сканер получает символ / строку вместо int. Кроме того, ваш l oop прекратит работу, если символ / строка будет прочитан на первой итерации, поскольку ваше условие l oop вернет false, если x изначально установлен в 1. Вы можете исправить это, установив вместо этого -1 , Более того, вместо использования блока try catch вы можете использовать метод hasNextInt (), чтобы проверить, печатает ли пользователь int или нет.

Scanner sc = new Scanner(System.in);

int x = -1;
do {
    System.out.println("Select option ");   
    System.out.println("1) Circle ");
    System.out.println("2) Rectangle ");
    System.out.println("3) Triangle ");
    System.out.println("4) Exit ");

    if (sc.hasNextInt())
    {
        x = sc.nextInt();
    }
    else
    {
        System.out.println("Invalid input. Please try again.");

        // Flush the buffer
        sc.nextLine();
    }
} while (x < 1 || x > 4);

sc.close();
0 голосов
/ 01 февраля 2020

Put

s c .nextLine ();

следующий

x = s c .nextInt ();

...