Eine Geschichte über Missverständnisse im Umgang mit Java-Scannern (Memo)

Inhaltsverzeichnis

Ausführungsumgebung

Java version : 12.0.1 Codebeschreibung: Texteditor (Atom) Verwendetes Betriebssystem: Windows (es funktionierte auf dem Mac nur wegen des Zeichencodeproblems) Hintergrund des Problems: Ich fragte mich, ob ich mit dem, was Java-Anfänger gelernt hatten, etwas anfangen könnte, und als ich versuchte, den Code selbst zu schreiben, trat ein Fehler auf

Probleme aufgetreten, Fehlermeldungen

Das Problem, das ich angesprochen habe, ist ein Programm, das die Scannerklasse verwendet und erst wieder eingibt, wenn eine andere Taste als eine bestimmte Eingabetaste eingegeben wird (in diesem Fall wurde ich aufgefordert, 1 oder 2 einzugeben). Zuerst habe ich nur über die Funktion nachgedacht und sie zusammengebaut.

errorFile.java


Scanner sc = new Scanner().nextInt();
while(sc){
  switch(sc){
    case 1:
    //Prozess 1
    break;
    case 2:
    //Prozess 2
    break;
    default:
    //Prozess 3
    break;
  }
}

Wie Sie sehen, funktioniert es natürlich nicht. An diesem Punkt können Sie sehen, dass wir viele Fehler in unserem Verständnis gemacht haben. Selbst wenn Sie es nicht verstehen, macht es mehr Spaß, es zu versuchen, und wenn Sie einen Fehler machen, überprüfen Sie es jedes Mal und beheben Sie den Fehler! Dies ist das Ergebnis einer flachen Zusammenstellung.

Was wurde missverstanden

An dieser Stelle werde ich erklären, woran ich gedacht habe. Wenn Sie nur sehen möchten, wie Eingabefehler behoben werden, fahren Sie mit der Codebeschreibung fort. Ich denke, das wird eine Schlange sein.

Die Inhalte, die an dieser Stelle missverstanden wurden, sind hauptsächlich die folgenden Inhalte 〇 Ich dachte, dass das Innere von () von while () eine Schleifenbedingung ist → Schleife tatsächlich, bis die Bedingung in () im Booleschen Wert falsch wird

〇 Ich dachte, dass die Scannerklasse ein Formular mit dem Scannervariablennamen = new Scanner () ist. NextInt () → Tatsächlich sind Instanziierung und Erfassung von Eingabeelementen separate Funktionen. Mit anderen Worten, neuer Scanner () und .nextInt () können getrennt werden. Wenn es sich um diese Anweisung handelt, wird der int-Typ zunächst vom Scanner erfasst, und es tritt ein zusätzlicher Fehler auf ...

〇 Ich verstehe die Ausnahmebehandlung nicht → Es wird nur die numerische Eingabe unterstützt. Wenn die Eingabe als Zeichenfolge erfolgt, tritt eine Ausnahme auf, die nicht ordnungsgemäß ausgeführt werden kann. Die Ausnahmebehandlung wird auch nach der Lösung eingegeben, aber ehrlich gesagt gibt es immer noch nicht genügend Test für die Ausnahmebehandlung.

Code nach Auflösung

Hier ist ein relativ sauberer Code, nachdem die bisherigen Missverständnisse mithilfe von Fragen, Materialien, Büchern usw. großer Vorfahren gelöst wurden.

SolutionFile.java


int all = 0;
  while(all == 0){
    try{
      Scanner sc = new Scanner(System.in);
      switch(sc.nextInt()){
        case 1:
          //Prozess 1
          all +=1;
          break;
        case 2:
          //Prozess 2
          all +=1;
          break;
        default:
          //Prozess 3
          break;
      }
    }catch(Exception e){
      //Prozess 4
    } 
  }

Was denken Sie? Zumindest funktioniert es nach meinen Absichten. Kennen Sie die Lesbarkeit, woher die int alle stammen, und die Ausnahmebehandlung von catch? Ich schreibe Code, der angeblich ist, aber wenn er funktioniert, ist er in Ordnung! Wenn ja, ist das überzeugend. Machen wir das.

Codebeschreibung

Hier finden Sie eine kurze Erläuterung des vollständigen Codes (SolutionFile.java).

Zunächst einmal, wenn Sie jeden Bereichsbereich auflisten (Hier wird mit dem Bereich vom Anfang bis zum Ende geschrieben)

while // 1
  try // 2
    Scanner // 3
    switch // 4
      case 1:
      case 2:
      default:
    switch
  try 
  catch
  catch
while

So was while > try == catch > switch > case == default nicht wahr

// 1 Wenn Sie nicht währenddessen beenden, wird der Vorgang vom Versuch zu fangen endlos wiederholt. In dieser Bedingung wird der Anfangswert von all zuerst deklariert und die Bedingung lautet "bis alle anders als 0 werden". Mit anderen Worten, wenn der Wert von all addiert oder subtrahiert wird, endet die Schleife.

// 2 Es ist ein Prozess, der als nächstes einen Fehler verursachen kann. Die Möglichkeit eines Fehlers und der Inhalt, den Sie normalerweise fehlerfrei behandeln möchten, sind in try und die Ausnahme in catch enthalten. Und wie unten erläutert, ist catch der Schleifenteil in while und verlässt die Schleife nicht. Nachdem die Verarbeitung in catch ausgeführt wurde, kehrt die Verarbeitung wieder zum Anfang von while zurück. ..

Apropos, Ich denke, wenn Sie sich auf die Tatsache beschränken, dass ein Fehler ursprünglich auftritt, ist dies nur die Eingabe des Scanners, aber ich habe versucht, nur den Schalter zu bewegen, aber es ist ein Fehler aufgetreten. Unten finden Sie den Code zum Bewegen des Schalters

Changefile.java


int all = 0;
  while(all == 0){
    try{
      Scanner sc = new Scanner(System.in);
    }catch(Exception e){
      //Prozess 4
    } 
      switch(sc.nextInt()){
        case 1:
          //Prozess 1
          all +=1;
          break;
        case 2:
          //Prozess 2
          all +=1;
          break;
        default:
          //Prozess 3
          continue;
      }
  }

Error:Symbol kann nicht gefunden werden
switch(sc.nextInt()){
               ^
Symbol:Variable sc

Es wird angenommen, dass der Grund dafür ist, dass das Element von sc im Schalter erfasst wird.

// 3 Hier müssen Sie es nur eingeben. Obwohl es in diesem Code am Rand geschrieben ist, import java.util.Scanner; Ist diese Beschreibung, weil es zuerst deklariert wird. Ich deklariere es nicht oft, also nur hier, ohne den Import zu deklarieren Scanner sc = new java.util.Scanner(System.in); Es scheint kein Problem zu sein.

// 4 Hier werden die eingegebenen Inhalte erfasst und die Verarbeitung entsprechend den erfassten Inhalten geändert. Bedingte Ausdrücke sind mit der if-Anweisung möglich, aber die switch-Anweisung ist ausgewählt, da Sie sie leicht lesen können und die Bedeutung des Codes leicht zu lesen ist. nextInt() Deshalb fragen Sie nach Zahlen. case 1: case 2: Also, zusätzlich zu jedem Prozess, um aus der while-Schleife herauszukommen all += 1 Auf diese Weise wird der Wert von allen um 1 addiert. Infolgedessen ist all = 1, und durch Erfüllen der Bedingung der Schleife "bis alle anders als 0 werden" wird die Bedingung falsch und die Schleife wird verlassen.

Wenn standardmäßig eine andere Zahl als 1 oder 2 eingegeben wird, wird die Verarbeitung an den Anfang von while zurückgesetzt, ohne dass die Schleifenbedingung auf false geändert wird, indem der Wert von all nicht geändert wird.

Mit anderen Worten, bitten Sie sie, es mehrmals einzugeben, bis 1 oder 2 eingegeben werden! Wenn Sie eine andere Zahl oder Zeichenfolge eingeben, wird diese endlos wiederholt! Das ist der Prozess.

Zusammenfassung

Die Funktionen, die ich implementieren wollte Wenn etwas anderes als 1 oder 2 eingegeben wird, fragen Sie erneut danach Es ist eine Funktion namens.

Der Punkt, den ich falsch verstanden habe while-Bedingung, Scannerkonfiguration, Ausnahmebehandlung

Und der Inhalt dieses Artikels ist, dass ich das Missverständnis korrigiert und es gelöst habe. Obwohl es funktioniert hat, enthält der Code immer noch viel Abfall. Daher gibt es Probleme wie das Schneiden von Abfall, das Ausprobieren der Ausnahmebehandlung und die Frage, ob der Code für andere leicht zu lesen ist. Daher möchte ich ihn auch in Zukunft weiter versuchen. Ich werde. Danke für Ihre Kooperation.

Recommended Posts

Eine Geschichte über Missverständnisse im Umgang mit Java-Scannern (Memo)
Verwendung der Java Scanner-Klasse (Hinweis)
Die Geschichte des Versuchs, JAVA File zu bedienen
[Java] Verwendung von Map
Verwendung der Java-Klasse
[Java] Verwendung von removeAll ()
Verwendung von Java Map
Verwendung von Java-Variablen
Verwendung von HttpClient (Get) von Java
So erstellen Sie einen Java-Container
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
Wie langsam ist Javas Scanner?
[Verarbeitung × Java] Verwendung von Variablen
[JavaFX] [Java8] Verwendung von GridPane
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
Wie verwende ich Klassen in Java?
[Verarbeitung × Java] Verwendung von Arrays
So erstellen Sie ein Java-Array
Verwendung von Java-Lambda-Ausdrücken
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps
So erstellen Sie eine Java-Kalenderzusammenfassung
Ein Memorandum zur Verwendung von Eclipse
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
[Leicht verständliche Erklärung! ] Verwendung der Java-Instanz
[Einführung in Java] So schreiben Sie ein Java-Programm
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
Wie erstelle ich einen Discord Bot (Java)
[Leicht verständliche Erklärung! ] Verwendung des Java-Polymorphismus
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
[Verarbeitung × Java] Verwendung der Klasse
[Verarbeitung × Java] Verwendung der Funktion
[Leicht verständliche Erklärung! ] Verwendung von ArrayList [Java]
[Java] Erfahren Sie, wie Sie Optional richtig verwenden
[Leicht verständliche Erklärung! ] Verwendung von Java-Überladung
try-catch-finally Ausnahmebehandlung Verwendung von Java
[Leicht verständliche Erklärung! ] Verwendung der Java-Kapselung
[Persönliches Memo] Interaktion mit dem Zufallszahlengenerator in Java
[Java] So verwenden Sie Teilzeichenfolgen, um einen Teil einer Zeichenfolge auszuschneiden
Verwendung von Swifts Codable Super Personal Memo
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
Eine Geschichte über die Java 11-Unterstützung für Webdienste
Eine Geschichte über das JDK in der Java 11-Ära
So zeigen Sie eine Webseite in Java an
Verwendung des Java-Frameworks mit AWS Lambda! ??
So konvertieren Sie einen Soliditätsvertrag in eine Java-Vertragsklasse
Verwendung der Java-API mit Lambda-Ausdrücken
[Leicht verständliche Erklärung! ] Verwendung der Java-Vererbung [Erklärung überschreiben]
Verwendung der replace () -Methode (Java Silver)