делать, пока l oop и проблема с пользовательским вводом - PullRequest
0 голосов
/ 26 марта 2020

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

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int number = 0;


    do {
        System.out.println("Input a number!");
        number = scanner.nextInt();
        if (!scanner.hasNextInt()) {
            System.err.println("This is not a number");
        }

    } while (!scanner.hasNextInt());

    System.out.println("You entered: " + number);

}

Ответы [ 3 ]

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

Вы получаете исключение InputMisMatchException, потому что, если вы введете строку в scanner.nextInt(), она немедленно выдаст ошибку и остановит программу, прежде чем она сделает что-либо еще, поэтому она не достигнет вашего оператора if. Один из способов обойти эту проблему - вместо этого получить пользовательский ввод в виде строки, try, чтобы проанализировать его для int, и завершить l oop, если он не выдает исключение. Это моя реализация:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String input = "";
    int number = 0;
    boolean end = true;


    do {
        System.out.println("Input a number!");
        input = scanner.nextLine();
        try {
            number = Integer.parseInt(input);
            end = true;
        } catch(Exception e) {
            System.err.println("This is not a number");
            end = false;
        } 

    } while (!end);

    System.out.println("You entered: " + number);

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

Сделайте это следующим образом:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = 0;
        boolean valid;
        do {
            valid = true;
            System.out.print("Input an integer: ");
            try {
                number = Integer.parseInt(scanner.nextLine());
            } catch (NumberFormatException e) {
                System.out.println("This is not an integer. Try again.");
                valid = false;
            }
        } while (!valid);

        System.out.println("You entered: " + number);
    }
}

Пробный прогон:

Input an integer: a
This is not an integer. Try again.
Input an integer: 12.34
This is not an integer. Try again.
Input an integer: 45
You entered: 45

Примечания:

  1. Используйте Scanner:nextLine вместо Scanner::nextInt; особенно когда вы имеете дело с вводом в al oop. Проверьте Сканер пропускает nextLine () после использования next () или nextFoo ()? для получения дополнительной информации.
  2. scanner.hasNextInt() следует использовать до scanner.nextInt(), т.е.
    if(scanner.hasNextInt()) {
        number = scanner.nextInt();
    }
Если вы хотите ввести любое число (не только целое число), используйте number = Double.parseDouble(scanner.nextLine());, но обязательно объявите number как переменную double, т.е. как double number = 0.0.
0 голосов
/ 26 марта 2020

Посмотрите, поможет ли приведенный ниже код достичь того, что вы хотите сделать.

public class Solution {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String number;
    do {
        System.out.println("Input a number!");
        number = scanner.next();
    } while (!isNumeric(number));

    System.out.println("You entered: " + number);
  }

  public static boolean isNumeric(final String str) {
    // null or empty
    if (str == null || str.length() == 0) {
        return false;
    }
    return str.chars().allMatch(Character::isDigit);
  }
}
...