Как вы обрабатываете неправильный ввод, если вам нужно, чтобы пользователь ввел целое число? - PullRequest
4 голосов
/ 09 марта 2020

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

import java.io.IOException;

public class Question2 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        boolean active = true;
        String num_string_positive = "";
        String num_string_negative = "";
        int my_int;
        while (active) {
            try {
                my_int = in.nextInt();
            } catch(IOException e) {
                active = false;
            }
            in.close(); 
        }
    }

}

Это не похоже на работу; Кажется, что-то не так с блоком catch. Когда я наведите курсор мыши на IOException, Eclipse говорит: «Недоступный блок перехвата для IOException. Это исключение никогда не выдается из тела оператора try». Не должен ли нецелочисленный ввод генерировать исключение ввода-вывода при вызове метода nextInt()?

Когда я заменяю catch(IOException e) на catch(Exception e), код выполняется, но он всегда завершается после один вход, даже если вход является целым числом.

Что я делаю не так?

Ответы [ 7 ]

5 голосов
/ 09 марта 2020
 public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while (sc.hasNextInt()) {
      System.out.println("Input is an integer.");
      sc.nextLine(); //Store this input in an array or variable as per your need.
    }
    int number = sc.nextInt();
  }

Этот код будет проверять, является ли ввод целым числом, если это так, то он продолжит принимать ввод, и как только пользователь введет какое-то другое значение, он прекратит принимать ввод.

2 голосов
/ 09 марта 2020

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

import java.util.InputMismatchException;

public class Question2 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        boolean active = true;
        String num_string_positive = "";
        String num_string_negative = "";
        int my_int;
        while (active) {
            try {
                my_int = in.nextInt();
            } catch(InputMismatchException e) {
                active = false;
                in.close();
            } 
        }
    }

}
1 голос
/ 09 марта 2020

Ну, вы делаете несколько вещей неправильно. Помимо очевидного (вы поймете неправильное исключение, как вы выяснили), вы не выполняете цикл должным образом, а также не можете использовать nextInt().

Посмотрите на свои требования. Вы сказали:

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

Если вы используете nextInt(), как вы найдете любой нецелочисленный ввод? Очевидно, вам нужно сделать что-то еще здесь.

Попробуйте разбить программу на более мелкие куски. Вы могли бы ввести методы, которые сделают вашу работу проще и понятнее.

public class Question2 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        boolean active = true;
        String num_string_positive = "";
        String num_string_negative = "";
        int my_int;
        while (active) {

          // Get input
          String input = getInput();

          // Is input integer?
          active = isInteger( input );

          // If integer do something
          if( active ) {
             // something
          }

        }

    }

}

Если вы начнете с того, что набросаете свой код, например, с какого-то наброска, то у вас будет меньше проблем. Разбиение вашего кода на более мелкие фрагменты облегчает чтение, запись, понимание и отладку. В основном побеждает все вокруг.

1 голос
/ 09 марта 2020

Eclipse справедливо рекомендует, чтобы ваш catch блок, пытающийся поймать IOException, был недоступен. Это связано с тем, что ни один из вашего кода в соответствующем блоке try не выбрасывает это конкретное проверенное исключение. Все, что у вас есть в блоке try, - это вызов метода Scanner#nextInt. Согласно java документам этого метода, этот метод не генерирует IOException. Вместо этого он выдает следующие три исключения:

  • InputMismatchException - если следующий токен не соответствует регулярному выражению Integer или находится вне диапазона
  • NoSuchElementException - если ввод исчерпан
  • IllegalStateException - если этот сканер закрыт

Так что в вашем случае вы должны обновить свой блок catch, чтобы поймать InputMismatchException вместо этого.

Альтернативное решение для достижения вашей цели - использовать метод hasNextInt. Это будет намного чище.

На заметку не следует закрывать ресурс сканера, пока не закончите чтение.

while (in.hasNextInt()) {   
    my_int = in.nextInt(); 
} 

// close the scanner 
in.close(); 
1 голос
/ 09 марта 2020
while (active) {
    try {
        my_int = in.nextInt();
        active = false;
    } catch(InputMismatchException e) {
        System.out.println("Please enter a valid input!!");
    }
    in.nextLine();//clear the buffer
}
in.close();
  1. Вы должны поймать правильное исключение для обработки
  2. Вы должны завершить время, пока l oop с false, только для правильного ввода. Что вы пытаетесь сделать, так это то, что вы устраняете ошибки при неправильном вводе.
  3. Закройте сканер после завершения поиска ввода
1 голос
/ 09 марта 2020

Попробуйте:

 static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.print("Enter a number -> ");
            String input = sc.next();
            int intInputValue = 0;
            try {
                intInputValue = Integer.parseInt(input);
            } catch (NumberFormatException ne) {
                System.out.println("This is not a integer");
                break;
            }
        }
    }

Программа отобразит «это не целое число», если пользователь вводит ввод, отличный от целого.

0 голосов
/ 09 марта 2020

Прежде всего. Этот код всегда будет читать только один ввод, потому что метод in.close всегда будет выполняться внутри while l oop. Чтобы закрыть вход только тогда, когда целое число не читается, вы должны поместить его через некоторое время l oop, и это будет выполняться только тогда, когда активный флаг имеет значение false. С другой стороны, вы не можете перехватить IOException, потому что метод nextInt не выбрасывает его. Чтобы поймать исключение especifi c, отличное от Exception, необходимо использовать InputMismatchException

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...