Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ?

Käsekuchen

Mitglied
Java:
import java.util.Scanner;

public class Betrag {
        
            public static int betrag(int wert) {
            if(wert<0) {
                wert = wert *-1;
            }
            return wert;
            }
            
            public static double betrag(double wert) {
                
                if(wert<0) {
                    wert = wert *-1;
                }
                return wert;
                }
            
            public static float betrag(float wert) {
                
                if(wert<0) {
                    wert = wert *-1;
                }
                return wert;
                }
            
            public static short betrag(short wert) {
                
                if(wert<0) {
                    wert =(short)( wert *-1);
                }
                return wert;
                }
            
            public static long betrag(long wert) {
                
                if(wert<0) {
                    wert = wert *-1;
                }
                return wert;
                }
    
    
    
    
    public static void main (String[]args) {
        Scanner s = new Scanner(System.in);
        int eingabe = 0;
                do {
        
        System.out.println("welchen Datentyp wollen sie übergeben?");
        String a = s.nextLine();
        
        
        if(a.equals("int")) {
            System.out.println("welche Zahl wollen sie übergeben?");
            int x = s.nextInt();
            System.out.println("Betrag: "+betrag(x));
        }
        else if (a.equals("double")) {
            System.out.println("welche Zahl wollen sie übergeben?");
            double x = s.nextDouble();
            System.out.println("Betrag: "+betrag(x));
        }
        else if (a.equals("float")) {
            System.out.println("welche Zahl wollen sie übergeben?");
            float x = s.nextFloat();
            System.out.println("Betrag: "+betrag(x));
        }
        else if (a.equals("short")) {
            System.out.println("welche Zahl wollen sie übergeben?");
            short x = s.nextShort();
            System.out.println("Betrag: "+betrag(x));
        }
        else if (a.equals("long")) {
            System.out.println("welche Zahl wollen sie übergeben?");
            long x = s.nextLong();
            System.out.println("Betrag: "+betrag(x));
        }
        
        else if (a.equals("beenden")) {
            System.exit(0);
        }
        eingabe ++;
        
    }
    while(eingabe != 10);
    
    System.out.println("Programm ist vorbei");
    }
    
}
Wenn ich das Programm starte, läuft alles wie gewollt, der Betrag wird ausgegeben. Doch dann wenn die Schleife von neu beginnt wird 2 mal die Zeile 52 ausgegeben warum ist das so ?
 
Das Probklem ist, wie Du den Scanner einsetzt. Der Scanner kann auf zwei Arten eingesetzt werden:
  • Zeilenorientiert - hier kommt dann nextLine() zum Einsatz.
  • Tokenbasiert - das wären dann Methoden next, nextInt, ...

Du mixt diese beiden und das führt zu diesem Nebeneffekt.

Zum Verständnis einfach eine Erläuterung, wie ein Scanner Tokenbasiert arbeitet. Dazu nehmen wir uns einen Eingabestream und schauen uns an, was der Scanner macht.

Wichtige Info: Der Eingabestream verarbeitet Eingaben immer erst mit der Enter Taste!

Nehmen wir den Aufruf von nextInt, der Eingabestream ist leer. Also blockiert der Scanner - oder in anderen Worten: Der Scanner wartet auf eine Eingabe. Also geben wir ein: 3 gefolgt von einem Enter, das im Stream als Zeilenumbruch vorliegt. Das gebe ich als \n an.
Eingabestream ist somit "3\n" und da eine Einghabe vorliegt, kann der Scanner weiter verarbeiten.
Der Scanner liest nun Zeichen für Zeichen ein, bis ein Trennzeichen gefunden wird. Das Trennzeichen ist hier \n.
==> Eingabestream ist nur noch "\n" und Token ist "3".
Der Token ist ein gültiger int, also wird die 3 zurück gegeben. Der "\n" bleibt aber.

Wenn nun ein nextLine Aufruf kommt, dann geht der Scanner hin und liest alles ein bis einschließlich dem Zeilenumbruch:
Der Zeilenumbruch kommt sofort, also gibt nextLine() einen leeren String zurück.

Und das ist dann auch, was bei Dir passiert. Die erste Eingabe wird verarbeitet, es kommt zu diversen nextInt Aufrufen. Am Ende ist noch ein Zeilenumbruch im Eingabestream.

Es kommt dann zu den Zeilen:
Java:
        System.out.println("welchen Datentyp wollen sie übergeben?");
        String a = s.nextLine();
die sofort durchlaufen - a ist dann der leere String.

Du prüfst a auf diverse Werte - der leere String ist nirgends dabei also kein if Block wird betreten. Es kommt noch zu dem eingabe++; und dann läuft die Schleife wieder von Anfang an los und es kommt erneut zu den Zeilenm mit der Ausgabe und dem nextLine().

==> Du siehst zwei mal die Frage nach dem Datentyp.

Eine Mögliche Lösung: nach einem nextXxx() auch noch einmal ein nextLine() aufrufen (ohne die Rückgabe zu beachten). Das löscht nach dem Token alle weiteren Eingaben, die gemacht wurden.
Also wenn bei der EIngabe einer Zahl du eingibst "23 Hallo Welt!", dann würde das "Hallo Welt!"avom nextLine() gelesen.
 

Zurück
Oben