繁体   English   中英

扫描仪无法读取我的输入

[英]Scanner cannot read my input

当我运行以下代码时:

Startup类(由main()调用):

import java.util.ArrayList;

public class Startup {

    public void start() {

        // Build rooms
        final int WIDTH = 2;
        final int HEIGHT = 2;
        Room[][] room = new Room[WIDTH][HEIGHT];
        Rooms.build(room, WIDTH, HEIGHT);
        int x = 0;
        int y = 0;

        // Print starting room description
        Rooms.print(room, x, y);

        // Start game loop
        boolean playing = true;
        while (playing) {

            // Get user input
            String input = Input.getInput();
            System.out.println(input);

            // Movement commands
            if (input.equals("n")) {
                if (y > 0) {
                    y--;
                    Rooms.print(room, x, y);
                } else {
                    System.out.println("You can't go that way.");
                }
            }
        }
    }
}

Input

import java.util.Scanner;

public class Input {

    public static String getInput() {

        System.out.print("> ");
        try(Scanner in = new Scanner(System.in)) {
            String input = in.nextLine();
            input.toLowerCase();
            return input;
        }
    }
}

我将始终得到此NoSuchElementException

java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Scanner.java:1540)
    at Input.getInput(Input.java:11)
    at Startup.start(Startup.java:36)
    at Driver.main(Driver.java:11)

如果删除了start()的运动命令部分,则一切正常。 但是,当包含该部分时,总是会调用该异常,这使我认为它存在问题。 但是我的问题是:怎么了?

每次调用getInput时都在创建一个新的Scanner。 不幸的是,您每次都关闭它:

    try(Scanner in = new Scanner(System.in)) {
        String input = in.nextLine();
        input.toLowerCase();
        return input;
    }

此构造称为“尝试使用资源”。 它创建Scanner ,它是一个Closeable对象,并在try块的末尾将其关闭

这意味着扫描仪后面的输入流也被关闭。

关闭流后,将无法重新打开它。 来自该流的每个输入请求都将返回“文件结束”条件。 因此,每次在同一个(封闭的) System.in打开第一个扫描仪之后的新扫描仪时,您都会获得一个空的扫描仪,它位于“文件末尾”。

您只需要打开一次扫描仪即可。 然后,对于该程序的其余部分,请从同一打开的扫描仪中读取。 为此,您要么必须将所有程序都放在try-with-resources中,要么根本不使用try-with-resources。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM