Java扫描器不等待用户输入

时间:2018-09-26 17:25:59

标签: java java.util.scanner

我正在做一个小型游戏项目,该项目需要我通过Java控制台执行一些简单的I / O。下面的函数应采用由空格分隔的三个输入。不幸的是,当我尝试扫描用户输入时会出现问题。

public static String[] getVals(Board game)
{ 
    Scanner scan     = new Scanner(System.in);
    boolean canPlace = true;
    String [] inputs;
    do
    {
        System.out.println("Please input your choice\n");
        String input = scan.nextLine();
        inputs = input.split(" ");
        if(inputs.length == 3) 
        {
            if(game.setVal(inputs))
            {
                canPlace = true;
            }
        }
        else if(inputs[0].equalsIgnoreCase("quit")) 
        {
            quit();
        }
        else
        {
            System.out.println("That is not a valid play. Please try again.");
            canPlace = false;
        }
    }while(!canPlace);

    scan.close();
    return inputs;
}

这是我调用getVals方法时抛出的东西:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at SOS.getVals(SOS.java:101)

我以完全相同的方式读取了早期功能中的用户输入,并且可以正常工作。我不确定是否与问题有关,但这是该函数的扫描部分:

public static void intro() 
    {
        Scanner scan = new Scanner(System.in);
        System.out.println("Please input the player 1's name.\n ");
        Player Player1 = new Player(scan.nextLine());

        System.out.println("Please input the player 2's name.\n ");
        Player Player2 = new Player(scan.nextLine());

        System.out.println("What size do you want your board (Min size is 3, Max is 10)");
        int size = Integer.parseInt(scan.nextLine());
        scan.close();

谢谢您的建议!

1 个答案:

答案 0 :(得分:0)

在多个断开连接的地方使用的Test abc value : student1 Test xyz value : student2 Test rty value : student3 Test wer value : student4 System.in应该是该类的Scanner变量。您将其放在类中,但在任何方法的外部中:

static final

现在您可以在所有方法中使用public static final Scanner scan = new Scanner(System.in);

另外,与文件不同,您通常不需要关闭scan,因为它将在程序退出时得到照顾。


更好的方法是将System.in传递到每个需要它作为参数的方法中。例如:

Scanner

现在,您可以使用public static String[] getVals(Scanner scan, Board game) { boolean canPlace = true; ⋮ 方法或类似方法构造Scanner并将其传递给各种方法。

这使您可以自定义诸如使用main以外的其他内容的Scanner之类的东西,例如当您测试某项并且想要从文件中获取输入而不必键入内容时一直如此。

您甚至可以轻松地对System.in使用硬编码的输入,例如String,以建立测试套件或其他方法,以确保每种方法都能正确处理您向其抛出的所有输入