Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扫描仪内部方法不等待回答_Java_Java.util.scanner - Fatal编程技术网

Java 扫描仪内部方法不等待回答

Java 扫描仪内部方法不等待回答,java,java.util.scanner,Java,Java.util.scanner,已经为此挣扎了一天,在论坛上来回阅读,没有结果。任何人都可以告诉我为什么函数aMenu()的第二次调用返回零,而不等待新的用户输入?我尝试了各种方法,比如hasNextInt(),nextLine(),但都没有效果。在用户写入某些内容之前不应该hasNextInt()块吗?我怎样才能解决这个问题?谢谢 package FirstJavaPackage; import java.util.Scanner; public class testScanner { public static

已经为此挣扎了一天,在论坛上来回阅读,没有结果。任何人都可以告诉我为什么函数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;
    }
}
输出为:

在阿门努。。。输入一个整数: 2. 你输入了:2 在阿门努。。。输入一个整数:
您键入了:0

您需要在调用
aMenu()
时重复使用相同的
Scanner
对象:


有关进一步的讨论,请参见

在第一次调用后,您实际上关闭了输入流中的
系统

从文件中:


尽量不要在
aMenu
结束时关闭
扫描仪:在
aMenu
方法之外初始化扫描仪,并使该方法使用它。

因为
扫描仪。关闭
将关闭整个输入源,您应该将扫描仪传递到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;
    }
}

谢谢大家,现在它工作得很好,但我仍然不完全理解逻辑。好的,我在aMenu()函数结束时关闭了输入流,但我不是在下一次调用时用line Scanner keyboard=new Scanner(System.in)再次打开它吗?这就是我如何预测它发生的,我已经阅读了你推荐的链接,但我想我仍然错过了一些东西。为什么不这样工作,稍后关闭并重新打开流?再次感谢你,你在这里创造了一个伟大的社区@xx:首先,当你调用
keyboard.close()
时,它也会关闭
系统.in
。从那时起,无论您是否尝试创建任何进一步的扫描仪,您都无法从
系统中读取任何内容。谢谢,现在我明白了。因此,一旦一个流关闭,它将在程序的其余部分保持关闭状态,并且您无法扫描不存在的内容。。
When a Scanner is closed, it will close its input source if the source 
implements the Closeable interface.
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;
    }
}