Использование Scanner.next() для ввода текста
-
21-08-2019 - |
Вопрос
Я пытаюсь ввести текст с клавиатуры в 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, чтобы убедиться, что вы проверяете правильное равенство.