Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top