2016-04-25 8 views
0

Ich schreibe gerade ein Client/Server Ratespiel.Ich kann nach einer falschen Eingabe keine Eingabeaufforderung erhalten

ich eine guessGameServerHandler Klasse haben, die für einen Kunden eine einzige Instanz eines Spiels Griffe

(das Spiel Multi-Threaded ist) ich auch eine Client-Klasse Lesung im Eingang haben, dann reagiert der Handler.

Ich muss einen Fehler ausgeben, wenn der Benutzer eine Zeichenfolge statt einer Ganzzahl eingibt, dann zurückschleifen und erneut nach Eingabe fragen, aber es scheint nicht zu funktionieren. Irgendwelche Vorschläge?

Client-Code: (dies in einer Do While-Schleife ist, zu überprüfen, ob Eingabe richtige Nummer oder nicht gleich)

// Read in clients input 
     System.out.print("Enter guess: "); 

      guess = Integer.parseInt(stdin.readLine()); 


     // send guess to server 
     out.write(String.format("%s%n", guess)); 
     out.flush(); 

guessGameHandlerServer:

do { 
      try{ 
      // Read in guesses from user 
      guess = Integer.parseInt(in.readLine()); 
      }catch(NumberFormatException e){ 
      } 

     gs.guess(guess); 
     String timeForm = decFor.format(gs.getTimeRemaining()/1000D); 
     // Check user input against target number & time left 
     if (gs.getTimeRemaining() < 1) { 
      System.out.println(ID + " - (LOSE)" + timeForm + "/" + gs.getGuesses()); 
      client.close(); 
     } else if (gs.getTimeRemaining() > 0 && guess > gs.getTarget() && guess < maxNum) { 
      out.write(String.format("HIGH:%s:%d%n", timeForm, gs.getGuesses())); 
      out.flush(); 
      System.out.println(ID + " " + guess + "(HIGH)-" + timeForm + "s/" + gs.getGuesses()); 
     } else if (gs.getTimeRemaining() > 0 && (guess < gs.getTarget() && guess > 0)) { 
      out.write(String.format("LOW:%s:%d%n", timeForm, gs.getGuesses())); 
      out.flush(); 
      System.out.println(ID + " " + guess + "(LOW)-" + timeForm + "s/" + gs.getGuesses()); 
     } else if (gs.getTimeRemaining() > 0 && guess == gs.getTarget()) { 
      out.write(String.format("WIN:%d%n", gs.getGuesses())); 
      out.flush(); 
      System.out.println(ID + " " + guess + "(WIN)-" + timeForm + "s/" + gs.getGuesses()); 
     } else if (gs.getTimeRemaining() > 0 && (guess >= maxNum || guess < 1)) { 
      out.write(String.format("ERR:%d%n", gs.getGuesses())); 
      out.flush(); 
      System.out.println(ID + " ** (ERR out of range)" + timeForm + "/" + gs.getGuesses()); 
     } 


     } while (true); 

mit dem aktuellen Code, Eingabe einer Zeichenfolge macht den Client Thread nur knapp, keine Ahnung warum.

Antwort

0

Behandeln Sie die Ausnahme auf der Client-Seite wie folgt aus:

while(true) { 
    try { 
     System.out.print("Enter guess: "); 

     guess = Integer.parseInt(stdin.readLine()); 
     break; 
    } 
    catch(Exception ex) { 
      System.out.println("Try again"); 
    } 
} 
    // send guess to server 
    out.write(String.format("%s%n", guess)); 
    out.flush(); 
+0

das funktioniert, aber ich versuche auch, eine Nachricht an den Server zu senden, wenn der Client eine falsche Eingabe eingibt. Das 'out.write' innerhalb des catch-Blocks zu setzen, scheint nicht zu funktionieren. – Travisty

+0

Was möchten Sie an den Server senden, wenn der Benutzer eine falsche Eingabe eingibt? Sie können "rate" sicher nicht senden, da es aufgrund falscher Benutzereingaben keinen Wert hat. Was auch immer Sie in diesem Fall senden möchten, legen Sie es in den "Fang" -Block, gefolgt von "Flush". Es sollte funktionieren. – AhmadWabbi

0

Sie benötigen einen Try-Catch-Block haben, in zu tun, während Schleife die Number zu fangen.

try{ 
     System.out.print("Enter guess: "); 

     guess = Integer.parseInt(stdin.readLine()); 
    }catch(NumberFormatException ne){ 
    //exception handling - set the do while loop condition to true so that it is called again 
    } 


    // send guess to server 
    out.write(String.format("%s%n", guess)); 
    out.flush(); 
Verwandte Themen