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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top