Usando Scanner.next () para obter a entrada de texto
-
21-08-2019 - |
Pergunta
Eu estou tentando obter a entrada de texto a partir do teclado no Java 6. Eu sou novo para o idioma e sempre que eu executar o seguinte código, eu recebo este erro:
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)
Am I mis-usando o método next ()? Eu pensei que iria esperar a entrada do usuário, mas parece que ele não é e lançar a exceção dizendo que não há nada deixado no scanner.
Solução
A razão para a exceção é que você está chamando keyIn.close()
depois de usar o scanner de uma vez, que não só fecha a Scanner
mas também System.in
. A próxima iteração você cria um novo Scanner
que prontamente explode porque System.in
está encerrada. Para corrigir isso, o que você deve fazer é apenas criar um scanner de uma vez antes de entrar no ciclo while
, e ignorar a chamada close()
inteiramente desde que você não quer perto System.in
.
Depois de consertar que o programa ainda não vai funcionar por causa das ==
e !=
comparações de strings que você faz. Ao comparar cadeias de caracteres em Java você deve usar equals()
para comparar o conteúdo de cordas. Quando você usa ==
e !=
você está comparando as referências de objeto, de modo que essas comparações sempre retornará falso em seu código. Sempre uso equals()
para comparar strings.
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;
}
Outras dicas
Para avaliar cordas que você tem a .equals uso
while (! C.equals ( "y")) {fazer coisas ...
-
declarar sua referência Scanner fora seus loops. você não tem para criá-lo e fechá-lo o tempo todo.
-
texto de cadeia comparar com o
equals
método, não com o==
operador.
Tente usar nextLine () e apenas olhando para o primeiro elemento na cadeia que é devolvida.
A! = E == só irá funcionar quando usado contra personagens ou outros tipos primitivos, que só irá funcionar no c #. Você vai precisar usar .equals para garantir que você está verificando a igualdade adequada.