Цикл For или While, пропускающий вход

Возможный дубликат:
Ошибка сканера при использовании nextLine после nextInt

Я создаю клиентскую программу, которая должна читать и строку, и целое число с моего сервера. В зависимости от того, какое целое число он получает, он добавляет некоторые метки в графический интерфейс. Пока что моя программа читает целое число, но пропускает строку. Следующий вывод - это вывод моей программы, когда я пытаюсь записать в программу целые числа:

  • Сервер пишет: 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;
}

Надеюсь, кто-нибудь сможет мне помочь с этим:)

Заранее спасибо.

2 ответа

Решение

Я нашел решение своего вопроса, оказалось, что это довольно просто!

Прежде всего позвольте мне объяснить, что я имею в виду.

Когда я запустил цикл while, моя программа пропустила строку, в которой должна была быть получена информация с сервера. я обнаружил, что причина этого в том, что input.nextLine(); был пуст, что имеет смысл, когда вы читаете API для input.nextLine();

Продвигает этот сканер за текущую строку и возвращает пропущенный ввод. Этот метод возвращает остаток текущей строки, исключая любой разделитель строк в конце. Позиция установлена ​​в начале следующей строки. Поскольку этот метод продолжает поиск по входным данным в поисках разделителя строк, он может буферизовать все входные данные в поисках строки, чтобы пропустить, если нет разделителей строк. Возвращает: пропущенная строка

так как строка, которую я пытался получить, была пустой строкой, она пропустила бы и установила имя " ".

вот полный полный код моей программы, и в настоящее время она работает:

Цикл 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);}

Спасибо за все ваши ответы, и я обязательно проголосую за вас:)

Я не вижу нигде в коде цикла, где вы увеличиваете o или изменить значение times, Таким образом, либо цикл пропускается полностью (то есть: times = 0), либо какое-то другое место в коде модифицирует либо переменную цикла (o) или условие цикла (times) - очень плохое кодирование в любом случае.

Ваши переменные цикла / правила приращения должны быть очень четкими при чтении цикла и легко различать, каковы условия запуска / остановки, без необходимости читать другие методы / и т. Д., Которые могут изменять значения во время итерации цикла.

Мое непосредственное предположение, что times = 0или вы были бы в бесконечной петле.

Другие вопросы по тегам