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()、スキャナーを1回使用した後に呼び出しているためです。これにより、スキャナーが閉じるだけでなくScanner、も閉じられますSystem.in。次のイテレーションでは、新しいものを作成します。これは、閉じScannerられているため、すぐに爆発します。System.inこれを修正するには、ループに入る前に1回だけスキャナーを作成し、閉じたくないので呼び出しを完全に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
  • ループの外側でスキャナー参照を宣言します。毎回作成して閉じる必要はありません。

  • equals文字列テキストを、演算子ではなくメソッドと比較します==

于 2009-07-02T00:37:27.013 に答える
0

nextLine()を使用して、返される文字列の最初の要素のみを確認してください。

!=および==は、文字またはその他のプリミティブ型に対して使用された場合にのみ機能し、c#でのみ機能します。適切な同等性をチェックしていることを確認するには、.equalsを使用する必要があります。

于 2009-07-02T00:36:29.387 に答える