Java Frage zu Scanner Klasse

D

Donnidonis

Gast
Ich habe diesen Programmcode:
Code:
public class Test {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException {
        // TODO code application logic here
        
        Scanner input = new Scanner(JOptionPane.showInputDialog("Eingabe:"));
        
        String name = input.nextLine();
        System.out.println(name);
        
        int pincode = input.nextInt();
        System.out.println(pincode);
        
    }
}

Den String name bekomm ich noch gefüllt, aber sobald es um das alter geht bekomm ich eine Exception, diese hier:
Code:
Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Scanner.java:907)
	at java.util.Scanner.next(Scanner.java:1530)
	at java.util.Scanner.nextInt(Scanner.java:2160)
	at java.util.Scanner.nextInt(Scanner.java:2119)
	at test.Test.main(Test.java:32)
Java Result: 1

Wenn ich anstatt der JOptionPane ein System.in in den Scanner lege geht alles, wieso nicht mit der JOptionPane? Weil ich will es damit haben und nicht mit System.in.
Hoffe mir kann wer helfen ;)
 
Ich bekomme ein EingabeFeld und hab nicht die Konsole.
Wenen ich z.b. ein .jar builde find ich die JOptionPane einfach besser ;)
 
Hm...und was soll später daraus werden ? Dann kannst du dir ja gleich ne GUI basteln ? :>
 
Erstmal wird es einfach nur ein klitze kleines Programm.
Ich muss für die Schule sowas zusammenbasteln.
 
Warum weiß ich nicht, aber man brauch immer eine neue Instanz.

So funktionierts:

Code:
String name = new Scanner(JOptionPane.showInputDialog("Eingabe:")).next();
System.out.println(name);
   
int pincode = new Scanner(JOptionPane.showInputDialog("Eingabe:")).nextInt();
System.out.println(pincode);

Edit: Eleganter ist natürlich eine extra Methode, welche Scanner-Objekte liefert
 
Zuletzt bearbeitet:
Es geht auch mit nur einem Dialog, Du musst lediglich die Scanner-Instanz richtig nutzen. Im Dialog gibst Du einen String (mit zwei Token, wenn ich den Code richtig interpretiere, also z.B. Max 2345) ein. Mit Scanner#nextLine springst Du aber bereits ans Ende dieses Strings! Mithin ist danach kein weiteres Token mehr vorhanden!

Code:
Scanner input = new Scanner(JOptionPane.showInputDialog("Eingabe:"));

String name = input.[B]next()[/B]; // lies das erste Token ein, den Namen
System.out.println(name);

int pincode = input.nextInt();
System.out.println(pincode);

Benutzereingaben sollte man ohnehin immer überprüfen...
Ergänzung ()

prog.ger schrieb:
Warum weiß ich nicht, aber man brauch immer eine neue Instanz

Unsinn :freak:
 
Zuletzt bearbeitet: (next() Aufruf fett gestellt)
soares schrieb:
Code:
Scanner input = new Scanner(JOptionPane.showInputDialog("Eingabe:"));

String name = input.next(); // lies das erste Token ein, den Namen
System.out.println(name);

int pincode = input.nextInt();
System.out.println(pincode);

Immer noch der gleiche Fehler..

soares schrieb:
Benutzereingaben sollte man ohnehin immer überprüfen...

In so einem kleinen Programm wohl kaum notwendig, ansonsten natürlich richtig.


soares schrieb:

Das man eine neue Instanz braucht kommt mir da auch merkwürdig vor, funktionierte aber ;)
 
Zuletzt bearbeitet:
prog.ger schrieb:
Hast Recht, hatte das nextLine() nicht gesehen. Habe bei mir im Code ja auch input.next(). Das man eine neue Instanz braucht kam mir da auch merkwürdig vor, funktionierte aber ;)

Damit hätte auch das nextLine() keine negative Auswirkung gezeigt, und das gewünschte Ergebnis war in der Tat erreicht. Aber die Aussage, dass man es so machen muss, ist schlicht falsch gewesen. Wenn man nicht versteht, warum etwas geht oder nicht geht, ist der Lerneffekt relativ gering.
Ergänzung ()

prog.ger schrieb:
Immer noch der gleiche Fehler..

Und der wäre?
 
RainbowSix schrieb:
Musst du es mit dem Scanner machen? Eine Arrayliste müsste eigentlich auch gehen.

Was willst Du denn hier mit einer ArrayList? Natürlich kann man es auch anders lösen, aber die einzelnen Tokens zu ermitteln und in eine Liste zu packen, wäre unnötig kompliziert (Ich würde für diesen einfachen Fall einen regulären Ausdruck verwenden, ansonsten einen richtigen Parser, der die Eingabe gleich validiert, aber das nur nebenbei, wobei man noch anführen sollte, dass in einer Maske zwei unterschiedliche Angaben nicht in ein Feld gehören, mithin die Analyse ohnehin vermieden werden sollte).

Die Lösung mit den zwei Dialogen ist insofern gar nicht so verkehrt. Dann braucht man aber keine Scanner-Instanzen.
 
Das Problem liegt wie du schon sagst am "JOptionPane.showInputDialog". Der Scanner kommt beim erneuten Aufruf damit einfach nicht klar, weil du mit dem Bestätigen des Inputs den Dialog beendest und er implizit nicht nochmal durch den Scanner aufgerufen werden kann. Daher kommt auch die NoSuchElementException, weil das Element (der Dialog) bereits beendet wurde. Einen neuen Dialog erhälst du nur durch den erneuten Aufruf von "JOptionPane.showInputDialog". Der Scanner wird überhaupt nicht benötigt.
PHP:
            String name = JOptionPane.showInputDialog("Name:");
            System.out.println(name);

            String pincode = JOptionPane.showInputDialog("PIN:");
            System.out.println(pincode);

Die Validierung muss per Hand durchgeführt werden oder du machst es wie oben per Scanner und erzeugst bei jeder Eingabe ein Scannerobjekt.
 
Dass man normalerweise zwei Felder benutzen würde, schrieb ich ja bereits. Der TE wollte aber lediglich ein Feld benutzen und die Eingabe dann mit einem Scanner verarbeiten. Dabei ist ihm ein Fehler unterlaufen, auf den ich ihn hingewiesen habe.

Eine Lösung, die dem richtigen Leben nahe kommt, würde einen Dialog verwenden, der zwei Felder hat, deren Inhalt jeweils ausgelesen werden kann. Die Fehlerquelle Scanner ist dann überflüssig.

Sollte die Intention des TE eine andere gewesen sein, mea culpa :D
Ergänzung ()

skillless schrieb:
Das Problem liegt wie du schon sagst am "JOptionPane.showInputDialog". Der Scanner kommt beim erneuten Aufruf damit einfach nicht klar, weil du mit dem Bestätigen des Inputs den Dialog beendest und er implizit nicht nochmal durch den Scanner aufgerufen werden kann. Daher kommt auch die NoSuchElementException, weil das Element (der Dialog) bereits beendet wurde..

Nochmal: Das Problem war, dass der Scanner falsch verwendet wurde. Mit dem Dialog hat das NICHS zu tun. Der Dialog liefert einen String. Die Eingabe wäre z.B. Max 2314. Der TE möchte diesen String in die zwei Bestandteile Name und Pincode parsen. Er liest aber mittels Scanner#nextLine den kompletten String ein. Beim Aufruf von Scanner#nextInt befindet sich der Scanner bereits am Ende des Strings und deswegen kommt die NoSuchElementException.

Wie schon gesagt, kann es gut sein, dass der TE das Problem unzureichend geschildert hat, und seine Intention eine andere war. Er in der Tat zwei Dialoge haben wollte. Dann möchte er bitte den Fall aufklären :)
 
Zurück
Oben