Methoden Exception läuft endlos!

Hallo erstmal,
ich will für eine eingabe, bei der man 0 und 1 eingeben kann, mit einem exception block verhindern, dass bei falscheingaben , zb nicht integer werte, die eingabe aufforderung wiederholt wird.

sobald ich aber eine falschen wert eingebe, läuft die methode in einer endlosschleife, und mir ist nicht ganz klar warum.

kann mir jemand helfen?

Java:
  //ProgramroutineLoop
  private static int routine(String ask){
    Scanner sc=new Scanner(System.in);
    int order;
    int trial;
    trial=0;
    
    System.out.print("\n");
    do{
      try{
        System.out.print(""+ask);
        System.out.print("\n");
        order=sc.nextInt();
        trial=1;
      }
      catch(Exception e){
        order=1;
      }
    }
    while(order<0 || order>1 || trial==0);
    return order;
  }
 
du brauchst ein:
Java:
sc.nextLine();

im catch-Block, da im Eingabestream noch ein '\n' liegt.
 
Es ist kein guter Stil, man sollte Problemfälle besser per "if" ausschließen - das ist deutlicher/einfacher zu verstehen, wenn mal ein anderer Programmierer den Code ließt.
Außerdem ist des (sehr) viel schneller, da
  • eine Exception erst mal bemerkt werden muss und dann
  • ein neues Exception-Objekt erzeugt wird.
Objekte zu erzeugen kostet recht viel Rechenzeit, dagegen ist ein "if" fast schon 'umsonst' zu haben.
 
Grundsätzlich ok, nur wie kann ich es mit einer If-Verzweigung ausschließen, dass ein falscher Datentyp angenommen wird ?

Das Programm würde doch vorher abstürzen, wenn man sagen wir für den Datatyp Int ein e eingibt!
Oder wäre das irgendwie auch mit einer If-Verzweigung möglich ?
 
Zuletzt bearbeitet:
Ich persönlich würde den try-catch um den .nextInt() beibehalten (aber die System.out-Zeilen rausschmeißen, und was genau soll 'trial' sein? -> umbenennen). Wenn's komplett ohne Exceptions sein soll, kann man den Aufruf aber auch kapseln:
Java:
boolean bReadSuccess = false ;
do{
  while( !Scanner.hasNext() ) {
    // Die nachfolgende Zeile kann man weglassen, dann wird's aber ein "busy waiting".
    try{ Thread.sleep(100); } catch( InterruptedException iE ) { ; }
  } // end while
  // now Scanner has another token
  if( Scanner.hasNextInt() )
  {
    order = Scanner.nextInt() ;
    bReadSuccess = (order >=0) && (order <= 1);
  } // end if
  // skip <ENTER>
  Scanner.next();
} while( ! bReadSuccess );
 

Zurück
Oben