2013-03-07 48 views
3

一直在掙扎着這一天,來回閱讀論壇,沒有結果。任何人都可以告訴我爲什麼函數aMenu()的第二次調用返回一個零,而不是等待新的用戶輸入呢?我嘗試了各種各樣的東西,像hasNextInt(),nextLine(),沒有任何工作。在用戶寫入內容之前不應該hasNextInt()阻塞?我該如何解決這個問題?謝謝。掃描儀裏面的方法不等待回答

package FirstJavaPackage; 
import java.util.Scanner; 

public class testScanner 
{ 
    public static void main(String[] args) 
    { 
     int choice = aMenu(); 
     System.out.println("You typed: "+choice); 
     choice = aMenu(); 
     System.out.println("You typed: "+choice); 
    } 

    public static int aMenu() 
    { 
     int result = 0; 
     System.out.println("In aMenu... enter an int: "); 
     Scanner keyboard = new Scanner(System.in); 
     if (keyboard.hasNextInt()) 
      result = keyboard.nextInt(); 
     keyboard.close(); 
     return result; 
    } 
} 

輸出是:

在AMENU ...進入一個int:您鍵入:2 在AMENU ...進入一個int: 您鍵入:0

回答

1

你需要重新使用跨越電話的同一Scanner對象aMenu()

public static void main(String[] args) 
{ 
    Scanner keyboard = new Scanner(System.in); 
    int choice = aMenu(keyboard); 
    System.out.println("You typed: "+choice); 
    choice = aMenu(keyboard); 
    System.out.println("You typed: "+choice); 
} 

public static int aMenu(Scanner keyboard) 
{ 
    int result = 0; 
    System.out.println("In aMenu... enter an int: "); 
    result = keyboard.nextInt(); 
    return result; 
} 

有關進一步的討論,請參閱How to use multiple Scanner objects on System.in?

+0

感謝所有,現在它工作正常,但我還是不明白的邏輯完全。好的,我在aMenu()函數結束時關閉了輸入流,但是不是我在下一次調用時再次打開它,並且掃描儀鍵盤=新掃描儀(System.in)?我就是這麼做的,我已經閱讀過你推薦的鏈接,但我想我仍然錯過了一些東西。爲什麼不這樣工作,以後關閉並重新打開流?再次感謝您在這裏建立一個偉大的社區! – 2013-03-07 09:40:39

+1

@xx:首先,當你調用'keyboard.close()'時,它也會關閉'System.in'。從那時起,無論您是否嘗試創建更多掃描儀,都無法從System.in中讀取任何內容。 – NPE 2013-03-07 09:42:37

+0

謝謝,現在我明白了。所以,一旦一個流被關閉,它仍然是關閉的程序的其餘部分,你不能掃描不存在的東西.. – 2013-03-07 10:02:21

0

第一次調用後,您實際關閉System.in輸入流。

Scanner.close()文檔:

When a Scanner is closed, it will close its input source if the source 
implements the Closeable interface. 

儘量不要在aMenu年底close掃描儀:初始化aMenu方法外掃描儀,使該方法使用它。

0

由於scanner.close將關閉整個輸入源,你應該通過掃描你的AMENU方法做這樣的事情:

import java.util.Scanner; 

public class TestScanner 
{ 
    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); 
     int choice = 0; 

     do 
     { 
     choice = aMenu(keyboard); 
     System.out.println("You typed: " + choice); 
     } while (choice > 0); 

     keyboard.close(); 
    } 

    public static int aMenu(Scanner keyboard) 
    { 
     int result = 0; 
     System.out.println("In aMenu... enter an int: "); 

     if (keyboard.hasNextInt()) 
      result = keyboard.nextInt(); 

     return result; 
    } 
}