2016-04-25 21 views
0

私は現在クライアント/サーバ推測ゲームを作成しています。不正な入力の後に入力プロンプトが表示されない

私はクライアントのためのゲームの単一のインスタンスを扱うguessGameServerHandlerクラス、(ゲームはマルチスレッドである)

を持って、私はまた、その後、ハンドラが応答し、入力中のクライアントクラスの読書を持っています。

ユーザーが整数の代わりに文字列を入力した後、ループバックして入力を再度要求しても、エラーを出力する必要がありますが、機能していないようです。助言がありますか?

クライアントコード:(これは、入力が正しい数に等しいか否かをチェック、do-while文である)

// 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); 

、文字列を入力します理由だけでクライアントスレッドを閉じることができます。

答えて

0

は、このようなクライアント側で例外をハンドル:

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

これは機能しますが、クライアントが誤った入力をしたときにもサーバーにメッセージを送信しようとしています。キャッチブロック内に 'out.write'を置くことは機能していないようです。 – Travisty

+0

ユーザーが間違った入力を入力したときに、何をサーバーに送信しますか?誤ったユーザー入力による値がないため、「推測」を送信することはできません。この場合に送信したいものは、「キャッチ」ブロックに入れてから「フラッシュ」します。それは動作するはずです。 – AhmadWabbi

0

あなたはループがNumberFormatExceptionがをキャッチする一方で、DOでのtry catchブロックを持っている必要があります。

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(); 
関連する問題