# Warum verursacht Scanner.nextInt() einen Fehler



## AmunRa (7. Jan 2009)

Hallo ich hab folgendes Problem 

Die Methode nextInt() der Klasse java.util.Scanner verhält sich nicht so wie ich dies erwarte

Kurzer programm Ausschnitt in der mein Problem zusammen gefasst wird.




```
import java.util.*; 

class test{ 
    
      public static void main(String [] args){ 
    	  Scanner sc= new Scanner(System.in);
    	while (true){
    		int i=0;
    		System.out.println("Choose 1,2,3");
    		String s = sc.nextLine();
    		try{
    			i = Integer.parseInt(s);
    		}catch(Exception e){
    			System.out.println(e+"Failure");
    		}
    			if (i==1){
    				System.out.println("nerf");
    			}
    			if (i==2){
                                                System.out.println("Please enter age");
    				int j= sc.nextInt();
    				System.out.println("2");
    			
    			}
    			if (i==3){
    				System.out.println("Exit");
    				System.exit(0);
    			}
    		}
    		
    		
    		
    	
    	  
      }
}
```

Wenn man zuerst 2 eingibt und danach eine andere Zahl wird automatisch bei neuem Eintritt in die Schleife ein NumberFormatException geworfen warum.


ein Weiteres Programm wo der Fehler sogar zu einer dauerschleife führt ist dieses.
Wenn man hier keine Zahl eingibt ist das programm in einer Dauerschleife 


```
import java.util.*; 

class test{ 
    
      public static void main(String [] args){ 
    	  Scanner sc= new Scanner(System.in);
    	  boolean corr=false;
    		do{
    			corr=false;
    			System.out.println("Geben sie ihr alter ein");
    			try{
    				sc.nextInt();
    			}catch(InputMismatchException e){
    				System.out.println(e+"Bitte nur Zahlen eingeben");
    				corr=true;
    			}
    		}while (corr);
    	
    	  
      }
}
```

Warum?

Danke für die Antwort

LG
AmunRa


----------



## Gast (7. Jan 2009)

Also bei mir klappt der Scanner wie er soll. Dein Beispiel 2 klappt wunder bar und beispiel auch, sobald man die Klammern richtig gesetzt hat und den zweiten sc.nextInt() gelöscht hat.


----------



## AmunRa (7. Jan 2009)

@Gast
Bin jetzt etwas verwirrt, da ich absichtlich die Klammersetzung so gemacht hab




Ein Workarround für das Problem hab ich bereits gefunden, in dem Ich immer mit nextLine und parseInt arbeite, aber nextInt methode verhällt sich eigentlich ziemlch seltsam.


----------



## Gast (7. Jan 2009)

Okay, vergiss das mit den Klammern. War ein Copy/Paste Fehler. Aber das zweite readInt ist weiterhin eine fehlerquelle. Ohne das klappt auch beispiel 1 einwandfrei.


----------



## AmunRa (7. Jan 2009)

ich weis das, das nextInt den Fehler den ich beschreibe verursacht aber warum?
Ich versuch nun noch einmal mein Problem genuer zu beschreiben. 


Beim Beispiel 1.

Ich gebe als erstes 1 ein, dann habe ich kein Problem 

wenn ich nun 2 eingebe, werde ich nach dem Alter gefragt nach eingabe des Alters springt er nun wieder an den Schleifen anfang und sollte dort wieder auf die auswahl warten, doch dies tut er nicht, sondern wirft sofort einen Fehler


Warum?  Genau diese verhalten bei dem Code verstehe ich nicht, da das eigentlich nicht passieren soll.


Bei Beispiel zwei 


Wenn ich eine Zahl eingebe funktioniet das Programm fehlerfrei (Ich weiß das das Programm nonsense ist, da die Eingabe in keine Variable geschrieben wird ist aber eigentlich für den Fehler irrelevant)

wenn ich aber einen Buchstaben oder ein sonderzeichen  eingebe kommt es bei mir zu einer Dauerschleife, was meiner Meinung nach nicht passieren soll

LG
AmunRA


----------



## Ebenius (8. Jan 2009)

Gast: Benutzt Du Linux/UNIX? Dann liegts an der Konsole. Die schreibt normaler Weise immer erst auf den Strom, wenn LF kommt. Was dagegen hilft erfährst Du hier.

Hoffentlich hab ich das Problem richtig überflogen.


----------



## AmunRa (8. Jan 2009)

Nein ich benutze Windows XP

und das ganze is ja eigentlich ja auch kein wirkliches Problem, da ich sowieso schon ein Workarraoud gefunden habe gegen die Dauerschleife, nur wundert mich dieses  Verhalten, da ich dafür keine Erklärung habe.

Aber vielleicht kann mir es jemand verständlich machen


----------



## AmunRa (8. Jan 2009)

Hab jetzt das zweite Beispiel ach noch auf einem Linux getestet und dort hab ich das problem auch


----------



## AmunRa (9. Jan 2009)

Hab jetzt nach langer Zeit gefunden was ich gesucht hatte: 

Das ganze ist ein Bug, wenn eine Fehlerhafte eingabe gemacht wird,dann wird der Buffer nicht gelehrt.

siehe Hier 

Um das ganze zu umgehen muss man einfach in den catch Block der nextInt() methode den Befehl  Die Methode
sc.nextLine() aufrufen diese liest dann die Fehlerhafte eingabe aus und leert damit den Buffer. und beim nächsten Schleifendurchlauf funktioniert die nextInt() methode dann wieder normal.

Das ausgebesserte Programm:


```
import java.util.*; 

class test{ 
    
      public static void main(String [] args){ 
int alter=0;
         Scanner sc= new Scanner(System.in); 
         boolean corr=false; 
          do{ 
             corr=false; 
             System.out.println("Geben sie ihr alter ein"); 
             try{ 
               alter= sc.nextInt();    //<- Wenn hier die Fehlerhafte eingabe gemacht wird (z.B ein Buchstabe)
             }catch(InputMismatchException e){ 
                System.out.println(e+"Bitte nur Zahlen eingeben"); 
 sc.nextLine();   //<- Ohne diese Zeile würde bei einer Fehlerhaften eingabe beider nextInt 
 //Methode eine Dauerschleife entstehen
                corr=true; 
             } 
          }while (corr); 
        
         
      } 
}
```

Damit kommt dann keine Dauerschleife heraus


----------



## Murray (9. Jan 2009)

AmunRa hat gesagt.:
			
		

> Das ganze ist ein Bug,


Das wurde zwar als Bug gemeldet, aber nicht als solcher anerkannt:



			
				Bug Database hat gesagt.:
			
		

> *State*
> 11-Closed, Not a Defect,   bug
> 
> *Evaluation*
> ...


----------



## AmunRa (9. Jan 2009)

Stimmt ich habs auch gelesen, 
muss aber erlich sagen, dass es mir sehr schwer fällt dieses verhalten sinvoll einzusetzten.


(vlt noch wenn man nicht von System.in liest aber sonst?)


----------

