4

我正在尝试从 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() 方法?我以为它会等待用户输入,但它看起来不是,并抛出异常说扫描仪中没有任何东西。

4

4 回答 4

8

异常的原因是您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;
}
于 2009-07-02T00:38:40.723 回答
2

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

while(!c.equals("y")) { 做事...

于 2009-07-02T00:38:10.223 回答
1
  • 在循环之外声明您的 Scanner 引用。您不必每次都创建并关闭它。

  • 用方法比较字符串文本equals,而不是用操作符==

于 2009-07-02T00:37:27.013 回答
0

尝试使用 nextLine() 并仅查看返回的字符串中的第一个元素。

!= 和 == 仅在用于字符或其他原始类型时才有效,这仅在 c# 中有效。您将需要使用 .equals 来确保您正在检查正确的相等性。

于 2009-07-02T00:36:29.387 回答