Использование Scanner.next() для ввода текста

Я пытаюсь получить ввод текста с клавиатуры в 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 ответа

Решение

Причиной исключения является то, что вы звоните keyIn.close() после того, как вы используете сканер один раз, который не только закрывает Scanner но также System.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

while (! c.equals ("y")) {делать вещи...

  • объявите ссылку на сканер вне вашей петли. Вам не нужно создавать его и закрывать каждый раз.

  • сравнить текст строки с методом equalsне с оператором ==,

Попробуйте использовать nextLine() и смотреть только на первый элемент в возвращаемой строке.

!= И == будут работать только когда используются против символов или других примитивных типов, которые будут работать только в C#. Вам нужно будет использовать.equals, чтобы убедиться, что вы проверяете правильное равенство.

Другие вопросы по тегам