Более простой способ гарантировать целочисленный ввод через сканер? - PullRequest
1 голос
/ 23 января 2009

Для программы, которую я пишу, мне нужно попросить пользователя ввести целое число от 1 до 8. Я пробовал несколько (более чистых) способов сделать это, но ни один из них не сработал, поэтому у меня осталось следующее:

    int x = 0;
    while (x < 1 || x > 8)
    {   
        System.out.print("Please enter integer  (1-8): ");

        try
        {
            x = Integer.parseInt(inputScanner.next());
        }
        catch(NumberFormatException e)
        {
            x = 0;
        }
    }

Где inputScanner - Сканер. Конечно, есть лучший способ?

Ответы [ 7 ]

4 голосов
/ 23 января 2009

Сканер делает регулярные выражения, верно? Почему бы сначала не проверить, соответствует ли оно "^ [1-8] $"?

3 голосов
/ 23 января 2009

Использование nextInt () уже является улучшением по сравнению с простым использованием метода next (). А до этого вы можете использовать hasNextInt (), чтобы избежать всех этих бесполезных исключений.

В результате чего-то вроде этого:

int x = 0;
do {
  System.out.print("Please...");
  if(scanner.hasNextInt()) x = scanner.nextInt();
  else scanner.next();
} while (x < 1 || x > 8);
2 голосов
/ 06 декабря 2012

Мне пришлось сделать калькулятор графического интерфейса (работает только с целыми числами), и проблема была в том, что Тесты не позволяли создавать исключения, если входные данные не были Integer. Поэтому я не мог использовать

try { int x = Integer.parseInt(input)} catch (Exception e) {dosomethingelse}

Поскольку программы Java обычно обрабатывают ввод в JTextField как строку Я использовал это:

if (input.matches("[1-9][0-9]*"){ // String.matches() returns boolean
   goodforyou
} else {
   dosomethingelse
}

// this checks if the input's (type String) character sequence matches
// the given parameter. The [1-9] means that the first char is a Digit
// between 1 and 9 (because the input should be an Integer can't be 0)
// the * after [0-9] means that after the first char there can be 0 - infinity
// characters between digits 0-9

надеюсь, это поможет:)

0 голосов
/ 25 марта 2015

Вы можете попробовать что-то вроде этого:

Scanner cin = new Scanner(System.in);
int s = 0;    
boolean v = false;
while(!v){
    System.out.print("Input an integer >= 1: ");

    try {    
        s = cin.nextInt();
        if(s >= 1) v = true;
        else System.out.println("Please input an integer value >= 1.");
    } 
    catch(InputMismatchException e) {
        System.out.println("Caught: InputMismatchException -- Please input an integer value >= 1. ");
        cin.next();
    }
}
0 голосов
/ 08 сентября 2010

Пример кода:

int x;
Scanner in = new Scanner(System.in);
System.out.println("Enter integer value: ");
x = in.nextInt();

Массив также может быть использован для хранения целого числа.

0 голосов
/ 23 января 2009

Apache Commons - ваш друг. См. NumberUtils.toInt (String, int)

0 голосов
/ 23 января 2009
String input;
int number;

while (inputScanner.hasNextLine())
{
    input = inputScanner.nextLine();

    if (input.equals("quit")) { System.exit(0); }
    else
    {
        //If you don't want to put your code in here, make an event handler
        //that gets called from this spot with the input passed in
        try
        {
            number = Integer.parseInt(input);
            if ((number < 1) || (number > 8))
            { System.out.print("Please choose 1-8: "); }
            else { /* Do stuff */ }
        }
        catch (NumberFormatException e) { number = 0; }
    }
}

Мне всегда нравится вводить полную строку, чтобы вы могли быть уверены, что пользователь нажал кнопку Enter. Если вы просто используете inputScanner.nextInt(), вы можете поместить две int в линию, и она вытянет одну, затем другую.

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