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();
}
-
Liczba 2 musi być większa od liczby 1
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.
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ą metodynextInt()
. 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
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
- warunek num2
- nie wiedząc co to jest obiekt kb, przeczytałbym
String
a następnietry
ingInteger.parseInt()
i jeśli nie maszcatch
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.
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);
}
}
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.
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();
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.
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