2013-02-09 33 views
2

我遇到了扫描程序在无限期while循环期间未阻止用户输入的问题。我试过使用hasNextLine(),并没有奏效。它只是运行循环无限地调用displayMenu()在循环期间Java扫描程序不阻止

 do { 

     displayMenu(); 

     int response; 
     while (iStream.hasNextLine()) { 
      response = Integer.parseInt(iStream.nextLine()); 

      switch (response) { 
       case 1: 
        decodeMessage(getPhrase()); 
        break; 
       case 2: 
        encodeMessage(getPhrase()); 
        break; 
       case 3: 
        displayAlphabet(); 
        break; 
       case 4: 
        done = true; 
        System.out.println("Goodbye."); 
        break; 
       default: 
        done = false; 
      } 
     } 

    } 
    while (!done); 

我也尝试不使用hasNextLine()但我结束了一个NoSuchElementException因为它贯穿完美第一次,但在第二次迭代中,它不会阻止用户输入。

do { 

     displayMenu(); 

     int response = Integer.parseInt(iStream.nextLine()); 

      switch (response) { 
       case 1: 
        decodeMessage(getPhrase()); 
        break; 
       case 2: 
        encodeMessage(getPhrase()); 
        break; 
       case 3: 
        displayAlphabet(); 
        break; 
       case 4: 
        done = true; 
        System.out.println("Goodbye."); 
        break; 
       default: 
        done = false; 

     } 

    } 
    while (!done); 

有什么想法?

+0

为什么嵌套while循环的?为什么不使用while while循环来检查是否检查hasNextLine()'的if块? – 2013-02-09 16:31:48

+0

我只是不明白为什么它不阻塞。对于System.in应该是吧?如果我改变它是有条件的,我会把开关体放在if语句中吗?尽管如此,我仍然可以无限地调用displayMenu()。 – 2013-02-09 16:39:28

回答

0

为我好以下工作:

private static void displayMenu() 
{ 
    System.out.println ("Menu:"); 
    System.out.println ("\t1: Decode message"); 
    System.out.println ("\t2: Encode message"); 
    System.out.println ("\t3: Display alphabet"); 
    System.out.println ("\t4: Exit"); 
} 

public static void main (String [] args) 
{ 
    Scanner scanner = new Scanner (System.in); 

    boolean done = false; 
    while (!done) 
    { 
     displayMenu(); 

     switch (Integer.parseInt (scanner.nextLine())) 
     { 
      case 1: 
       System.out.println ("Decoding..."); 
       break; 
      case 2: 
       System.out.println ("Encoding..."); 
       break; 
      case 3: 
       System.out.println ("Displaying alphabet..."); 
       break; 
      case 4: 
       System.out.println("Exitting..."); 
       done = true; 
       break; 
      default: 
       done = false; 
     } 
    } 
} 
+0

嗯...我在'getPhrase()'方法中声明并关闭了新的扫描器对象。传递先前声明的对象而不是固定它。 – 2013-02-09 16:44:41