Обработка исключений с пользовательским вводом, когда требуется несколько входов подряд - PullRequest
0 голосов
/ 15 сентября 2018

Я работаю над программой, в которой пользователь может добавлять людей и транспортные средства.Программа функционирует в соответствии с требованиями назначения scholl, однако я хочу, чтобы она работала еще лучше, обрабатывая исключения, если пользователь вводит недопустимое утверждение.

У меня есть это, и оно работает, если пользователя поставитьвернуться в меню программы, чтобы программа не аварийно завершала работу, но я не хочу, чтобы пользователь заново запускал процесс добавления объекта, а скорее повторил попытку с того места, где произошла ошибка.

Вот код:

    // adds person to registry
public void addPerson(){
    try {
        System.out.println("Name of person: ");
        String name = Main.sc.nextLine();
        System.out.println("Age of person: ");
        int age = Main.sc.nextInt();
        Main.sc.nextLine();
        System.out.println("City of residence: ");
        String city = Main.sc.nextLine();
        Person person = new Person(name, age, city);
        personList.add(person);
    }catch (InputMismatchException e){
        System.out.println("Not a valid input. Try again");
        Main.sc.nextLine();
    }
}

Ошибка произойдет, если пользователь введет в вопросе «Введите возраст:» что угодно, кроме целых чисел.

У меня есть другой способ добавленияТранспортные средства, требующие гораздо большего количества пользовательского ввода, и, в частности, в этом методе было бы очень плохо, если бы пользователю пришлось начинать все сначала.

Как это исправить?

1 Ответ

0 голосов
/ 15 сентября 2018

Создайте вспомогательный метод:

public int askInt(String prompt) {
    while (true) {
        System.out.println(prompt);
        try {
            return Main.sc.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("Please enter an integer number.");
        }
    }
}

Примечание: Ваше смешивание nextLine и next указывает на неправильное использование сканера;Вы должны использовать только один или только другой.Если вы хотите запросить у пользователя входные данные, которые могут содержать пробелы, сконфигурируйте сканер для разделения входных данных в новых строках вместо «любых пробелов».Сделайте это, вызвав sc.useDelimiter("\r?\n") сразу после его создания, и чтобы получить строку, просто позвоните next().Это восстановит всю строку.

...