方法内的扫描器不等待答案

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中... 输入一个整数: 2 你输入了:2 在aMenu中... 输入一个整数: 你输入了:0

3个回答

1
你需要在调用 aMenu() 的过程中重复使用相同的 Scanner 对象:
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;
}

如需进一步讨论,请参见如何在System.in上使用多个Scanner对象?


谢谢大家,现在它运行得很好,但我仍然不完全理解逻辑。好的,我在aMenu()函数的末尾关闭了输入流,但是我没有在下一次调用时再次打开它,使用Scanner keyboard = new Scanner(System.in)这一行代码?这就是我想要发生的事情,我已经阅读了您推荐的链接,但我想我还是缺少了一些东西。为什么它不能像那样工作,稍后关闭和重新打开流?再次感谢,您正在创建一个伟大的社区! - x x
1
@xx:首先,当你调用keyboard.close()时,它也会关闭System.in。从那时起,无论你尝试创建任何进一步的扫描器,你都无法从System.in中读取任何内容。 - NPE
谢谢,现在我明白了。一旦流被关闭,它将保持关闭状态,直到程序结束,你不能扫描不存在的东西。 - x x

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会关闭整个输入源,因此您应该将scanner传递给您的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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接