Обработка InputMismatchException в цикле while - PullRequest
1 голос
/ 01 апреля 2020

Итак, у меня есть while-l oop, где у вас есть 3 варианта на выбор, и вы выбираете их, вставляя число в стандартный ввод с помощью сканера, мой код выглядит так:

    int option;
    String request;
    Scanner input2 = new Scanner(System.in);
    System.out.println("Choose an option:\n" + "1-Get camera information\n" + "2-Submit Data\n"
         + "3-Exit");
    while(true){
        try {
            option = input2.nextInt();
            if (option == 1) {
                System.out.println("Camera name:");
                request = input2.nextLine();
                while (request.length() < 3 || request.length() > 15) {
                    System.out.println("Name has to be between 3 and 15 characters, insert a new one:");
                    request = input2.nextLine();
                }
                CamInfoRequest info_request = CamInfoRequest.newBuilder().setName(request).build();
                if (stub.camInfo(info_request).getReturn() != 0) {
                    System.out.println("Camera does not exist");
                } else {
                    System.out.println(stub.camInfo(info_request).getLatitude() + " " + stub.camInfo(info_request).getLongitude());
                }
            } else if (option == 2) {
                System.out.println("submit");
            } else if(option ==3){
                break;
            } else{
                System.out.println("Invalid option.");
            }
        }catch(InputMismatchException e){
            System.out.println("Invalid input");
        }
    }

Таким образом, как этот код вводится в бесконечном l oop, когда он ловит исключение, где он продолжает печатать «Неверный ввод», я попытался использовать input2.next () в перехват, но затем он ждет другого ввода, я надеваю не хочу, я не могу использовать input2.close (). Что я могу сделать?

Ответы [ 2 ]

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

Я также не могу использовать input2.close ().

Никогда не закрывайте экземпляр Scanner для System.in, поскольку он также закрывает System.in.

Я попытался использовать input2.next () при перехвате, но затем он ждет другого ввода, я не хочу

Использовать Scanner::nextLine вместо Scanner::next, Scanner::nextInt и c. Проверьте Сканер пропускает nextLine () после использования next () или nextFoo ()? , чтобы узнать почему.

Кроме того, попробуйте использовать do...while везде, где вам нужно попросить пользователя ввести снова данные в случае неверной записи.

Ниже приведен пример кода, включающий следующие пункты:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int option;
        boolean valid;
        Scanner input2 = new Scanner(System.in);
        do {
            valid = true;
            System.out.println("Choose an option:\n" + "1-Get camera information\n" + "2-Submit Data\n" + "3-Exit");
            try {
                option = Integer.parseInt(input2.nextLine());
                if (option < 1 || option > 3) {
                    throw new IllegalArgumentException();
                }
                // ...Place here the rest of code (which is based on the value of option)
            } catch (IllegalArgumentException e) {
                System.out.println("This is an invalid entry. Please try again.");
                valid = false;
            }
        } while (!valid);
    }
}

Пример прогона:

Choose an option:
1-Get camera information
2-Submit Data
3-Exit
abc
This is an invalid entry. Please try again.
Choose an option:
1-Get camera information
2-Submit Data
3-Exit
6
This is an invalid entry. Please try again.
Choose an option:
1-Get camera information
2-Submit Data
3-Exit
2

Не стесняйтесь комментировать в случае любых дальнейших сомнений / проблем.

0 голосов
/ 01 апреля 2020

Просто поместите оператор Scanner в свой блок try

while (true) {
            try {
                Scanner input2 = new Scanner(System.in);
                option = input2.nextInt();
                if (option == 1) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...