Jak używać skanera, aby zaakceptować tylko poprawny int jako wejście

Próbuję zrobić mały program bardziej solidny i potrzebuję z tym pomocy.

Scanner kb = new Scanner(System.in);
int num1;
int num2 = 0;

System.out.print("Enter number 1: ");
num1 = kb.nextInt();

while(num2 < num1) {
    System.out.print("Enter number 2: ");
    num2 = kb.nextInt();
}
  1. Liczba 2 musi być większa od liczby 1

  2. Chcę również, aby program automatycznie sprawdzał i ignorował, jeśli użytkownik wprowadzi znak zamiast liczby. Ponieważ teraz, gdy użytkownik wprowadza na przykład r zamiast liczby, program po prostu kończy działanie.

Author: Ivar, 2010-05-26

6 answers

Użycie Scanner.hasNextInt():

Zwraca true jeśli następny token na wejściu skanera może być zinterpretowany jako wartość int w domyślnym radix za pomocą metody nextInt(). Skaner nie przechodzi obok żadnego wejścia.

Oto fragment do zilustrowania:

Scanner sc = new Scanner(System.in);
System.out.print("Enter number 1: ");
while (!sc.hasNextInt()) sc.next();
int num1 = sc.nextInt();
int num2;
System.out.print("Enter number 2: ");
do {
    while (!sc.hasNextInt()) sc.next();
    num2 = sc.nextInt();
} while (num2 < num1);
System.out.println(num1 + " " + num2);

Nie musisz parseInt ani martwić się o NumberFormatException. Zauważ, że ponieważ metody hasNextXXX nie wyprzedzają żadnych danych wejściowych, może być konieczne wywołanie next(), jeśli chcesz pominąć "śmieci", jak pokazano powyżej.

Podobne pytania

 28
Author: polygenelubricants,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 00:04:22
  1. warunek num2
  2. nie wiedząc co to jest obiekt kb, przeczytałbym String a następnie trying Integer.parseInt() i jeśli nie masz catch wyjątku to jest to Liczba, jeśli nie, przeczytaj Nowy, może ustawiając num2 na Integer.MIN_VALUE i używając tego samego typu logiki w twoim przykładzie.
 4
Author: Ledhund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 12:42:39

To powinno zadziałać:

import java.util.Scanner;

public class Test {
    public static void main(String... args) throws Throwable {
        Scanner kb = new Scanner(System.in);

        int num1;
        System.out.print("Enter number 1: ");
        while (true)
            try {
                num1 = Integer.parseInt(kb.nextLine());
                break;
            } catch (NumberFormatException nfe) {
                System.out.print("Try again: ");
            }

        int num2;
        do {
            System.out.print("Enter number 2: ");
            while (true)
                try {
                    num2 = Integer.parseInt(kb.nextLine());
                    break;
                } catch (NumberFormatException nfe) {
                    System.out.print("Try again: ");
                }
        } while (num2 < num1);

    }
}
 3
Author: aioobe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 12:34:51

Spróbuj tego:

    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("^\\d+$");
        Scanner kb = new Scanner(System.in);
        int num1;
        int num2 = 0;
        String temp;
        Matcher numberMatcher;
        System.out.print("Enter number 1: ");
        try
        {
            num1 = kb.nextInt();
        }

        catch (java.util.InputMismatchException e)
        {
            System.out.println("Invalid Input");
            //
            return;
        }
        while(num2<num1)
        {
            System.out.print("Enter number 2: ");
            temp = kb.next();
            numberMatcher = p.matcher(temp);
            if (numberMatcher.matches())
            {
                num2 = Integer.parseInt(temp);
            }

            else
            {
                System.out.println("Invalid Number");
            }
        }
    }

Możesz również spróbować przetworzyć łańcuch do int, ale zazwyczaj ludzie starają się unikać rzucania WYJĄTKÓW.

Zrobiłem to, że zdefiniowałem Wyrażenie regularne, które definiuje liczbę, \d oznacza cyfrę liczbową. Znak + oznacza, że musi być jedna lub więcej cyfr. Dodatkowe \ przed \d jest spowodowane tym, że w Javie \ jest znakiem specjalnym, więc musi być unikalny.

 2
Author: npinti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 12:33:15

Widzę tę postać.isDigit idealnie pasuje do potrzeb, ponieważ wejście będzie tylko jednym symbolem. Oczywiście nie mamy żadnych informacji o tym obiekcie kb, ale na wszelki wypadek jest to java.util.Instancja skanera, sugerowałbym również użycie java. io. InputStreamReader do wprowadzania wiersza poleceń. Oto przykład:

java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
try {
  reader.read();
}
catch(Exception e) {
  e.printStackTrace();
}
reader.close();
 0
Author: Ilya Saunkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 12:42:46

Możesz również wziąć następny token jako łańcuch znaków, konwertuje ten łańcuch do tablicy znaków i sprawdzić, czy każdy znak w tablicy jest cyfrą .

Myślę, że to prawda, jeśli nie chcesz zajmować się wyjątkami.

 0
Author: LB40,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-26 12:50:23