我正在尝试从 Java 6 中的键盘获取文本输入。我是该语言的新手,每当我运行以下代码时,都会收到此错误:

package test1;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
    boolean quit = false;
    while (!quit){
        Scanner keyIn;
        String c = "x";
        while (c != "y" && c != "n") {
            keyIn = new Scanner(System.in);
            c = keyIn.next();
            keyIn.close();
        }
        if (c == "n")
            quit = true;
    }
 }
}


Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:838)
at java.util.Scanner.next(Scanner.java:1347)
at test1.Test.main(Test.java:11)

我是否错误地使用了 next() 方法?我以为它会等待用户输入,但看起来并没有,并抛出异常,说扫描仪中没有留下任何内容。

有帮助吗?

解决方案

原因的例外是,您所呼叫keyIn.close()您使用的扫描仪一次后,它不仅关闭ScannerSystem.in。就在第二天重复创建一个新的Scanner其及时炸毁了,因为System.in现已关闭。为了解决这个问题,你应该做你进入while循环之前,并跳过close()调用只能创建一个扫描仪,一旦完全,因为你不希望关闭System.in

固定的程序仍然不会因为你做的==!=字符串比较的工作后。当比较Java中的字符串必须使用equals()字符串的内容进行比较。当您使用==!=你是比较对象引用,所以这些比较会永远在你的代码返回false。 始终使用equals()比较字符串。

while (!quit){
    Scanner keyIn = new Scanner(System.in);
    String c = "x";
    while (!c.equals("y") && !c.equals("n")) {
        c = keyIn.next();
    }
    if (c.equals("n"))
        quit = true;
}

其他提示

要评估你必须使用.equals字符串

而(!c.equals( “Y”)){做的东西......

  • 在循环之外声明您的扫描仪引用。您不必每次都创建它并关闭它。

  • 将字符串文本与方法进行比较 equals, ,不与操作员一起 ==.

尝试使用nextLine(),并且仅在寻找返回的字符串中的第一个元素。

针对字符或其它原始类型使用时,!=和==只会工作,这将仅在c#工作。您将需要使用.equals以确保您检查适当的平等。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top