Java: Ist ein Scanner object nur einnalig benutzbar?

Liebe/-r Experte/-in,

diese Tage lerne ich Java per Autodidaktik.
Es soll theoretisch so gehen:

String s1;
int i1;
double d1;
Scanner In = new Scanner (System.in);
s1 = In.next ( );
s1 = In.nextLine ( );
i1 = In.nextInt ( );
d1 = In.nextDouble ( );

Geht praktisch bei mir leider nicht. Also die zweite s1 hat keine Chance, etwas durch das Input zugewiesen zu bekommen. Außerdem gebt es Exceptions wie folgt:

Exception in thread „main“ java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextDouble(Scanner.java:2387)
at Text.main(Text.java:18)

In der Zeile 18 steht:

d1 = In.nextDouble ( );

Für Hilfe bedanke ich mich im voraus.
MfG
peter

Geht praktisch bei mir leider nicht. Also die zweite s1 hat
keine Chance, etwas durch das Input zugewiesen zu bekommen.
Außerdem gebt es Exceptions wie folgt:

Exception in thread „main“ java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextDouble(Scanner.java:2387)
at Text.main(Text.java:18)

Ich denke, es hat damit zu tun, dass Du den Scanner nach einem ganz bestimmten Datentyp abfragst, nämlich einem Double. Evtl passt die Eingabe nicht zur Konvertierung und daher wird eine InputMismatchException geworfen.

Ein Angabe Deiner Eingabewerte wäre hilfreich, vielleicht stand dort ein String oder eine andere nicht als Double zu parsende Angabe.

Hallo Peter,

ich fange ganz vorne an.
Wenn du die Möglichkeit hast, mach dich zuerst mit den Java-Konventionen vertraut. Wenn du dich z.B. daran hältst Variablen immer klein zu beginnen (in statt In) wirst dir das Leben sehr viel einfacher machen (nicht falsch verstehen bitte, ist nur ein Tipp).

Wenn ich mir das so ansehe, versuche ich mal Scanner.next() und Scanner.nextLine() zu erklären.

Zunächst weist du der Variable s1 das erste Wort des eingegebenen Satzes (in.next() gibt also deine Eingabe bis zum ersten Leerzeichen zurück UND SPRINGT dann an diese Stelle!) zu.

Direkt danach überschreibst du den Inhalt von s1 mit dem Rest deiner Eingabe bis zum Zeilenumbruch (in.nextLine()).

Ich vermute mal, du hast nur ein Wort eingegeben und Eingabe gedrückt. Das bedeutet, du weist s1 dieses eine Wort zu und überschreibst es mit dem Rest der Zeile - also nichts.

Der Fehler ist ein anderes Thema. nextInt() und nextDouble() erwarten Zahlen, die sie verarbeiten können. Gibst du aber keine Zahl ein, stürzen diese Funktionen mit der o.g. Maldung ab. InputMismatch heißt hier soviel: habe Zahl „double“ erwartet, war aber ein Buchstabe!? Da das nicht geht stürzt er ab.

Ich empfehle dir folgendes, um zu verstehen was passiert:

s1 = In.next ( );  
System.out.println("A:"+s1);  
s1 = In.nextLine ();  
System.out.println("B:"+s1);  
i1 = In.nextInt ( );  
System.out.println("C:"+i1);  
d1 = In.nextDouble ();  
System.out.println("D:"+d1);  

Und dann die Eingaben ohne Anführungszeichen :
„abcd efgh ijkl“„abc“
und beim zweiten Versuch:
„abcd efgh ijkl“"123"„456“

Viele Grüße
Stefan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Peter,

ein Scanner Objekt sollte zunaechst nur solange genutzt werden, bis die End-Of-Input Condition
erfuellt ist, siehe hierzu auch
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Sc…

 public static void main(String[] args) {
 String s1;
 int i1;
 double d1;
 Scanner In = new Scanner("abc \n000 cdef\n 1 5,0");
 s1 = In.next();
 System.out.println(s1);
 s1 = In.next();
 System.out.println(s1);
 s1 = In.nextLine();
 System.out.println(s1);
 i1 = In.nextInt();
 System.out.println(i1);
 d1 = In.nextDouble();
 System.out.println(d1);
 }

Dein Problem liegt wahrscheinlich daran, dass du z.B. 5.0 anstatt 5,0 eingegeben hast. Doubles werden hier im locale Format eingelesen, also in Deutschland mit einem „,“ als Trenner.

Gruss
Norsemanna

Ja, es stimmt.
Schönen Dank, Norsemanna!
Gruss,
peter

Hallo Peter,

Ich komme leider grade erst aus dem Urlaub und kann
erst jetzt antworten.

Wenn ich meine Verspätung betrachte, dann ist es
wahrscheinlich, dass du das Problem bereits selber
gelöst hast.

Leider bin ich nämlich kein Java programmierer sondern
schreibe nur Java Script. Das ist ein nicht zu
unterschätzender Unterschied, wenn es um
klassenspezifische Fragen geht :wink:

Grundsätzlich sieht das Problem nach einem
eingabefehler oder konversionsproblem aus. Ist die
Rückgabe von nextDouble immer ein double? Oder muss die
Eingabe an der nächsten Stelle vielleicht ein Double
sein und ist es nicht?

Mehr kann ich die leider nicht helfen

grüzele
basti