Wie halte ich einen Scanner zu werfen Ausnahmen, wenn die falschen Typs eingetragen ist?
Hier einige Beispiel-code:
import java.util.Scanner;
class In
{
public static void main (String[]arg)
{
Scanner in = new Scanner (System.in) ;
System.out.println ("how many are invading?") ;
int a = in.nextInt() ;
System.out.println (a) ;
}
}
Wenn ich das Programm ausführen, und geben Sie es ein int
wie 4
, dann geht alles in Ordnung.
Auf der anderen Seite, wenn ich Antwort too many
es nicht zum lachen in meinem lustigen Witz. Stattdessen bekomme ich(wie erwartet):
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:819)
at java.util.Scanner.next(Scanner.java:1431)
at java.util.Scanner.nextInt(Scanner.java:2040)
at java.util.Scanner.nextInt(Scanner.java:2000)
at In.main(In.java:9)
Gibt es einen Weg, um es zu ignorieren-Einträge, die nicht von ints oder re-prompt mit "Wie viele sind Invasion?" Ich würde gerne wissen, wie diese beiden.
InformationsquelleAutor David | 2010-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eines der vielen
hasNext*
Methoden, dieScanner
hat für die pre-Validierung.Dies verhindert, dass
InputMismatchException
von selbst geworfen, weil Sie immer sicher, dass es WIRD übereinstimmen, bevor Sie es Lesen.java.util.Scanner-API
boolean hasNextInt()
: Zurücktrue
wenn das nächste token in diesem scanner die Eingabe interpretiert werden kann als int-Wert in die Standard-radix mit dennextInt()
Methode. Der scanner nicht Voraus Vergangenheit jede Eingabe.String nextLine()
: Fortschritte dieser scanner nach der aktuellen Zeile und gibt die Eingabe übersprungen wurde.Tun, beachten Sie die Abschnitte in Fett.
hasNextInt()
nicht Voraus Vergangenheit jede Eingabe. Wenn es zurücktrue
können Sie vorab den scanner durch den AufrufnextInt()
, die wird nicht werfen eineInputMismatchException
.Wenn es zurück
false
, dann müssen Sie überspringen den "Müll". Der einfachste Weg dies zu tun ist, gerade indem SienextLine()
, wahrscheinlich zweimal, aber mindestens einmal.Warum müssen Sie möglicherweise zu tun
nextLine()
zweimal ist die folgende: angenommen, dies ist der Eingang eingegeben:Lassen Sie uns sagen, der scanner ist am Anfang der Eingabe.
hasNextInt()
ist wahr,nextInt()
zurück42
; scanner ist jetzt bei kurz vor das erste[enter]
.hasNextInt()
ist falsch, dienextLine()
gibt eine leere Zeichenfolge zurück, eine zweitenextLine()
zurück"too many!"
; scanner ist jetzt bei nur nach das zweite[enter]
.hasNextInt()
ist wahr,nextInt()
zurück0
; scanner ist jetzt bei kurz vor das Dritte[enter]
.Hier ist ein Beispiel, einige dieser Dinge zusammen. Sie können Experimentieren, zu untersuchen, wie
Scanner
funktioniert.Sagen wir mal die Eingabe:
Dann die Letzte Zeile der Ausgabe ist:
InformationsquelleAutor polygenelubricants
Im Allgemeinen habe ich wirklich, wirklich nicht mit der gleichen library-Aufruf zum Lesen und analysieren. Language-libraries zu sein scheinen sehr unflexibel und oft können nicht gerade gebogen werden.
Den ersten Schritt zieht die Daten aus dem System.in sollte nicht in der Lage zu scheitern, so haben Sie es gelesen, wie eine Zeichenfolge in eine variable, dann zu konvertieren, dass die string variable in eine int. Wenn die Konvertierung fehlschlägt, groß--drucken Sie Ihre Fehler und fahren Sie Fort.
Wenn Sie wickeln Sie Ihren stream mit etwas, das kann eine exception werfen, es wird ziemlich verwirrend ist nur, in welchem Zustand das ganze Durcheinander lässt Ihren stream in.
InformationsquelleAutor Bill K
Es ist immer ein Gewinn für haben Ihre Anwendung wirft einen Fehler wenn ein Fehler Auftritt, im Gegensatz zu Möglichkeiten, um halten es passiert.
Eine alternative zum wickeln Sie den code in eine
try {...}
catch {...}
block fürInputMismatchException
.Vielleicht wollen Sie auch wickeln Sie den code in eine
while
loop zu haben, dieScanner
halten Eingebung, bis eine bestimmte Bedingung erfüllt ist.Ich ließ mein Beispiel, es nicht richtig zu mir. Ich wollte nur geben die wichtigsten Punkte: sollten Sie Fehler auffangen, die geworfen werden, nicht die Arbeit um Sie herum und einer Technik, die "re-prompt". Trotzdem danke Kurresmack.
wie genau funktioniert ein try-catch-block arbeiten? i ' V nie benutzt vor.
Ich bin auf meinem Handy, ill versuche mein bestes.
try { // code here } catch(InputMismatchException e) { // catch wrong format }
InformationsquelleAutor Anthony Forloney