Java 扫描仪无法读取我的输入

Java 扫描仪无法读取我的输入,java,java.util.scanner,nosuchelementexception,Java,Java.util.scanner,Nosuchelementexception,当我运行以下代码时: 类Startup(由main()调用): 类输入: 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(

当我运行以下代码时:

Startup
(由
main()
调用):

输入

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;
        }
    }
}
我总是会得到这个
无接触异常

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
时,您都在创建一个新的扫描仪。不幸的是,您每次都要关闭它:

    try(Scanner in = new Scanner(System.in)) {
        String input = in.nextLine();
        input.toLowerCase();
        return input;
    }
这种构造称为“尝试使用资源”。它创建
扫描仪
,这是一个
可关闭的
对象,并在
try
块的末尾将其关闭

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

一旦关闭流,它就无法重新打开。来自该流的每个输入请求都将返回“文件结束”条件。因此,每次在同一(关闭的)
系统上,在第一个扫描仪之后打开一个新的扫描仪。在
中,您将得到一个位于“文件末尾”的空扫描仪


您需要做的是只打开扫描仪一次。然后对于程序的其余部分,从同一个打开的扫描仪读取。要做到这一点,您必须将所有程序都放在try-with-resources中,或者干脆不使用try-with-resources。

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

    try(Scanner in = new Scanner(System.in)) {
        String input = in.nextLine();
        input.toLowerCase();
        return input;
    }
这种构造称为“尝试使用资源”。它创建
扫描仪
,这是一个
可关闭的
对象,并在
try
块的末尾将其关闭

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

一旦关闭流,它就无法重新打开。来自该流的每个输入请求都将返回“文件结束”条件。因此,每次在同一(关闭的)
系统上,在第一个扫描仪之后打开一个新的扫描仪。在
中,您将得到一个位于“文件末尾”的空扫描仪


您需要做的是只打开扫描仪一次。然后对于程序的其余部分,从同一个打开的扫描仪读取。要做到这一点,您要么必须将所有程序都放在try-with-resources中,要么干脆不使用try-with-resources。

您是否真的输入了任何数据?请注意,您应该执行
input=input.toLowerCase()如果要将输入小写。目前您的代码没有这样做。您是否确实输入了任何数据?请注意,您应该执行
input=input.toLowerCase()如果要将输入小写。当前您的代码没有这样做。我以为OP正在关闭扫描仪,因此system.in也关闭了,但在您解释了
Try with resources
之前,找不到关闭扫描仪的代码行。非常感谢。该死,我从来没有注意到,
Scanner.close()
也在关闭使用的输入流。啊,我不知道使用资源进行尝试会关闭输入流,我添加了它以解决资源泄漏问题。不管怎样,谢谢你的帮助!我以为OP正在关闭扫描仪,因此system.in也关闭了,但在您解释了
Try with resources
之前,找不到关闭扫描仪的代码行。非常感谢。该死,我从来没有注意到,
Scanner.close()
也在关闭使用的输入流。啊,我不知道使用资源进行尝试会关闭输入流,我添加了它以解决资源泄漏问题。不管怎样,谢谢你的帮助!