Завершение цикла с пустой строкой (клавиша Enter) внутри SwitchCase

*изменено сканирование ввода
Я пытаюсь завершить цикл while с помощью клавиши ввода/пустой строки. Тестовые коды ниже работают нормально.

    Scanner scan = new Scanner(System.in);
    String line;

    while ( (line=scan.nextLine()).length() > 0)  
    {
        System.out.println(line);
    }

Однако, когда я интегрирую его в свою основную программу (цикл while помещается в регистр int switch внутри цикла do-while), программа пропускает коды @case2 и продолжает цикл do-while.

int input;
do{
      System.out.print("Choose a function (-1 to exit): ");
      input=scan.nextInt();
      switch (input)
      {
          case 1:
          break;
          case 2:
          //same while loop here
          break;
      }

  }while(input!=-1);

Пример вывода:

Choose a function (-1 to exit): 1
Choose a function (-1 to exit): 2
//skip case2 coding
Choose a function (-1 to exit): 1
Choose a function (-1 to exit): -1
//program ends

person RachelCYY Chong    schedule 20.06.2015    source источник
comment
Не могли бы вы опубликовать все тело метода? Спасибо.   -  person Jire    schedule 20.06.2015
comment
Да, особенно там, где назначено input.   -  person markspace    schedule 20.06.2015
comment
вы не принимаете никаких входных данных внутри корпуса переключателя, который превращается в бесконечный цикл   -  person aakansha    schedule 20.06.2015
comment
цикл do while должен заканчиваться semicolon   -  person Johny    schedule 20.06.2015


Ответы (3)


Я не уверен на 100%, но я думаю, что сканер не читает весь ввод. Когда сканер начинает читать, в буфере есть пустая строка (символ новой строки), поэтому он возвращает пустую строку, что приводит к тому, что длина вашей строки равна 0, и цикл немедленно выходит из цикла.

Вот мое лучшее предположение о вашей текущей программе:

public class InputTest
{

   public static void main( String[] args )
   {
      Scanner scan = new Scanner( System.in );
      int input = 0;
      do {
         System.out.print( "Choose a function (-1 to exit): " );
         input = scan.nextInt();
         switch( input ) {
            case 1:
               System.out.println("..1");
               break;
            case 2:
               System.out.println("..2");
               //same while loop here
               String line = scan.nextLine();
               System.out.println(">>"+line+"<<");
               while( line.length() > 0 ) {
                  System.out.println( "  Read line: " + line );
                  line = scan.nextLine();
                  System.out.println(">>"+line+"<<");
               }
               break;
         }
      } while( input != -1 );
   }
}

И его вывод:

run:
Choose a function (-1 to exit): 1
..1
Choose a function (-1 to exit): 2
..2
>><<
Choose a function (-1 to exit): -1
BUILD SUCCESSFUL (total time: 11 seconds)

Вы можете видеть, что строка печатается как >><<, что означает, что она была прочитана, но пуста. Я думаю, что новая строка осталась от «2» выше, поскольку новая строка не является частью числа 2 и останется в буфере.

person markspace    schedule 20.06.2015

Спасибо за помощь! После некоторых проб и ошибок я получил код для работы

Scanner scan = new Scanner(System.in);
  int input;
  do{
  System.out.print("Choose a function (-1 to exit): ");
  input=scan.nextInt();       

  switch (input)
  {
  case 1:
     break;
  case 2:
     System.out.println("..2"); 
     String line;
     scan.nextLine();//skips the entire current line.
     while ( (line=scan.nextLine()).length() > 0)  
        {
        System.out.println(line);
        }
        break;
     }
  }while(input!=-1);    

System.out.println(), кажется, устраняет помехи от scan.nextInt(),
Хотя это только моя теория

person RachelCYY Chong    schedule 20.06.2015
comment
Проблема была со сканером, так как после ввода 2 в текущей строке не было токенов. Поэтому вам нужно пропустить текущую строку и перейти к началу следующей строки, чтобы прочитать ввод. - person aakansha; 21.06.2015

Сканер не может прочитать ввод, так как в текущей строке нет токенов (после нажатия 2).

Вам нужно использовать scan.nextLine() (чтобы игнорировать остальную часть текущей строки и переместить сканер в начало следующей строки) перед чтением ввода.

do{

      System.out.print("Choose a function (-1 to exit): ");
      input=scan.nextInt();       

      switch (input)
      {
      case 1:
         break;
      case 2:
         scan.nextLine();//skips the entire current line.
         while ( (line=scan.nextLine()).length() > 0)  
            {
            System.out.println(line);
            }
            //System.out.println(line.length());
            break;
         }
}while(input!=-1);

Выход

Choose a function (-1 to exit): 2
hello
hello
bye
bye

Choose a function (-1 to exit):-1

Надеюсь, это поможет вам.

person aakansha    schedule 20.06.2015