So verwenden Sie Scanner, um nur gültige int als Eingabe zu akzeptieren

Lesezeit: 2 Minuten

So verwenden Sie Scanner um nur gultige int als Eingabe
John

Ich versuche, ein kleines Programm robuster zu machen, und brauche dabei etwas Hilfe.

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. Nummer 2 muss größer sein als Nummer 1

  2. Außerdem möchte ich, dass das Programm automatisch überprüft und ignoriert, wenn der Benutzer ein Zeichen anstelle einer Zahl eingibt. Denn gerade jetzt, wenn ein Benutzer zum Beispiel eintritt r Anstelle einer Zahl wird das Programm einfach beendet.

  • Von welchem ​​Typ ist ‘kb’? Normalerweise erhält man beim Lesen von stdin (System.in) für jedes einzelne Zeichen den ASCII/UTF8-Code, was die gewünschte Prüfung sehr einfach macht. Aber das scheint im Objekt hinter der ‘kb’-Referenz versteckt zu sein. Niemand kann zu diesem Zeitpunkt einen funktionierenden Code bereitstellen!

    – Fisch

    26. Mai 2010 um 12:31 Uhr


  • wäre kb new Scanner(System.in) zufällig?

    – Andrej Fierbinteanu

    26. Mai 2010 um 12:32 Uhr

  • statischer Scanner kb = neuer Scanner (System.in);

    – John

    26. Mai 2010 um 12:34 Uhr

1646315826 696 So verwenden Sie Scanner um nur gultige int als Eingabe
polygenelubricants

Verwenden Scanner.hasNextInt():

Kehrt zurück true wenn das nächste Token in der Eingabe dieses Scanners als interpretiert werden kann int Wert im Standardradix mit dem nextInt() Methode. Der Scanner bewegt sich nicht über eine Eingabe hinaus.

Hier ein Ausschnitt zur Veranschaulichung:

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);

Das müssen Sie nicht parseInt oder sich Sorgen machen NumberFormatException. Beachten Sie, dass seit dem hasNextXXX Methoden nicht über eine Eingabe hinausgehen, müssen Sie möglicherweise aufrufen next() wenn Sie den “Müll” überspringen möchten, wie oben gezeigt.

Verwandte Fragen

  • Wie verhindere ich, dass ein Scanner Ausnahmen auslöst, wenn der falsche Typ eingegeben wird? (Java)

  • Sie können andere Datentypen verwenden, z. B. den Double-Referenztyp. Zum Beispiel: “scanner.hasNextDouble()”

    – TeachMeJava

    10. Oktober 2018 um 19:22 Uhr


1646315827 890 So verwenden Sie Scanner um nur gultige int als Eingabe
Ledhund

  1. die Bedingung num2 < num1 sollte num2 <= num1 sein, wenn num2 größer als num1 sein muss
  2. Da ich nicht weiß, was das kb-Objekt ist, würde ich a lesen String und dann trying Integer.parseInt() und wenn nicht catch eine Ausnahme, dann ist es eine Zahl, wenn Sie dies tun, lesen Sie eine neue, vielleicht indem Sie num2 auf Integer.MIN_VALUE setzen und dieselbe Art von Logik in Ihrem Beispiel verwenden.

Das sollte funktionieren:

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);

    }
}

Versuche dies:

    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");
            }
        }
    }

Sie könnten versuchen, die Zeichenfolge in eine zu zerlegen int auch, aber normalerweise versuchen die Leute, das Auslösen von Ausnahmen zu vermeiden.

Was ich getan habe, ist, dass ich einen regulären Ausdruck definiert habe, der eine Zahl definiert, \d bedeutet eine Ziffer. Die + Vorzeichen bedeutet, dass eine oder mehrere Ziffern vorhanden sein müssen. Das Extra \ vor dem \d liegt daran, dass in Java die \ ist ein Sonderzeichen, also muss es maskiert werden.

Ich sehe, dass Character.isDigit perfekt zu den Anforderungen passt, da die Eingabe nur ein Symbol sein wird. Natürlich haben wir keine Informationen über dieses kb-Objekt, aber nur für den Fall, dass es sich um eine java.util.Scanner-Instanz handelt, würde ich auch vorschlagen, java.io.InputStreamReader für die Befehlszeileneingabe zu verwenden. Hier ist ein Beispiel:

java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
try {
  reader.read();
}
catch(Exception e) {
  e.printStackTrace();
}
reader.close();

So verwenden Sie Scanner um nur gultige int als Eingabe
LB40

Was Sie tun könnten, ist auch, das nächste Token als String zu nehmen, wandelt diesen String in ein char-Array um und teste das Jedes Zeichen im Array ist eine Ziffer.

Ich denke, das ist richtig, wenn Sie sich nicht mit den Ausnahmen befassen möchten.

924080cookie-checkSo verwenden Sie Scanner, um nur gültige int als Eingabe zu akzeptieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy