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
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.
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.
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.
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.
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