0

重複の可能性:
nextInt の後に nextLine を使用する場合のスキャナーの問題

サーバーから文字列と整数の両方を読み取る必要があるクライアント プログラムを作成しています。受け取った整数に応じて、いくつかのラベルを GUI に追加します。これまでのところ、私のプログラムは整数を読み取りますが、文字列をスキップします。次の出力は、整数をプログラムに書き込もうとしたときのプログラムの出力です。

  • サーバー書き込み: 1
  • サーバー書き込み: 1
  • システムプリント: 1
  • システム印刷: j1
  • システムプリント: 名前

問題は、文字列をスキップするため、文字列を書き込めないことです。この問題を回避するにはどうすればよいですか (forループも試したことに注意してください)

私のコードは次のとおりです。

int times = client.reciveCommando();
int o = 0;
System.out.println(times);

while (o != times) {
  int j = client.reciveCommando();
  System.out.println("j"+ j);
  String name = client.reciveString();
  System.out.println("Name " +name);
  createUser(j, name);
  o++;

}

createUser メソッド:

private void createUser(int j, String reciveChat) {
  if (j == 1) {
    chatPerson1.setVisible(true);
    lbl_Chatperson1_userName.setVisible(true);
    lbl_Chatperson1_userName.setText(reciveChat);
  } else if (j == 2) {
    lbl_chatPerson2.setVisible(true);
    lbl_userName2.setVisible(true);
    lbl_userName2.setText(reciveChat);
  } else {
    chatPerson3.setVisible(true);
    lbl_userName3.setVisible(true);
    lbl_userName3.setText(reciveChat);
  }
}

client.reciveCommando メソッド:

public int reciveCommando() throws IOException{
  Integer i = input.nextInt();
  return i;
}

client.reciveString メソッド:

public String reciveString(){
  String x = input.nextLine();
  return x;
}

誰かがこれで私を助けてくれることを願っています:)

前もって感謝します。

4

2 に答える 2

1

oの値をインクリメントまたは変更しているループコードのどこにも表示されませんtimes。したがって、ループが完全にスキップされているか(つまり、times = 0)、コード内の他の場所がループ変数(o)またはループ条件(times)のいずれかを変更しています-どちらの場合も非常に悪いコーディングです。

ループ変数/インクリメントルールは、ループを読み取る際に非常に明確であり、ループの反復中に値を変更する可能性のある他のメソッドなどを読み取る必要なしに、開始/停止条件が何であるかを簡単に識別できる必要があります。

私の当面の推測ではtimes = 0、そうしないと、無限ループに陥ることになります。

于 2012-10-09T15:57:29.080 に答える
0

私は私の質問に対する解決策を見つけました。それは非常に簡単であることが判明しました!

まず第一に、私が何を言おうとしているのかを説明させてください。

私のプログラムがwhileループを実行したとき、基本的にサーバーからの入力を受け取るべき行をスキップしました。その理由は、input.nextLine(); であることがわかりました。空だったのは、input.nextLine(); の API を読み取るときに意味があります。

このスキャナを現在の行を超えて進め、スキップされた入力を返します。このメソッドは、最後の行セパレーターを除いて、現在の行の残りを返します。位置は次の行の先頭に設定されます。このメソッドは引き続き入力を検索して行区切りを探すため、行区切りが存在しない場合は、スキップする行を検索するすべての入力をバッファリングする可能性があります。戻り値: スキップされた行

取得しようとした行は空の行だったので、スキップして name を " " に設定していました。

ここに私のプログラムの完全なコードがあり、現在動作しています:

while ループ:

            while (o != times) {
                int j = client.reciveCommando();
                System.out.println("j"+ j);
                    String name = client.reciveString();
                    System.out.println("Name " +name);
                    createUser(j, name);    
                o++;
            }

client.reciveString();

    public String reciveString(){

    String x = input.next();
    return x;
}

createUser();

    private void createUser(int j, String reciveChat) {
    if (j == 1) {
        chatPerson1.setVisible(true);
        lbl_Chatperson1_userName.setVisible(true);
        lbl_Chatperson1_userName.setText(reciveChat);

    }else if (j == 2) {
        lbl_chatPerson2.setVisible(true);
        lbl_userName2.setVisible(true);
        lbl_userName2.setText(reciveChat);
    }else if (j == 3){
        chatPerson3.setVisible(true);
        lbl_userName3.setVisible(true);
        lbl_userName3.setText(reciveChat);}

すべての回答に感謝します。必ず投票します:)

于 2012-10-10T11:14:22.273 に答える