Scanner

2 respostas
L

Estou tendo um problema com a classe Scanner…os dados do empregado horista sao adicionados corretamente, mas quando chega no empregado mensalista, ele esta pulando o campo nome e ja aparece o campo “horas extras” para digitar. O q pode estar acontecendo?

...
Empregado h = new Horista();
Empregado m = new Mensalista();
		
Scanner teclado = new Scanner(System.in);

System.out.println("Empregado Horista");
System.out.println("---------------------------");
System.out.print("Nome: ");
String nomeHorista = teclado.nextLine();
System.out.print("Horas trabalhadas: ");
double resultado = h.calculaLiquidoMes(teclado.nextInt());
System.out.println();

System.out.println("Empregado Mensalista");
System.out.println("---------------------------");
System.out.print("Nome: ");
String nomeMensalista = teclado.nextLine();
System.out.print("Horas extras: ");
double resultado2 = m.calculaLiquidoMes(teclado.nextInt());
System.out.println();
...

2 Respostas

BrunoBastosPJ

Este problema é comum em C, e também acontece com o método nextLine.

A minha explicação é esta, acho que é bem plausível hehehe

Quando você digita alguma coisa e preciona ENTER você adiciona um caracter ao final da String digitada (\r)
Este caracter é o que indica o fim da String, ou seja é onde o método nextLine sabe que deve parar e pegar tudo que vem atrás.

Já os métodos next, nextInt e outros lêem até encontrar um caracter X que é definido no construtor da classe Scanner (Caso você não defina este caracter será espaço por default)
Então o caracter \r que representa o ENTER fica perdido no buffer. Caso você chame outros métodos como o nextInt ou next line estes métodos não terão problemas com o \r que está perdido, porque não é uma condição de “parada” para a leitura dos dados, porém quando você chama um nextLine logo após um nextInt ou next vem o grande problema…
Este nextLine identifica que existe um \r e acaba retornando para você uma String vazia.

Agora vamos ao que interessa :smiley:

Para resolver este problema basta você chamar um outro nextLine antes de onde o problema está acontecendo. No seu código a chamada vai entrar assim:

...
 double resultado = h.calculaLiquidoMes(teclado.nextInt());  
 System.out.println();  
   
 System.out.println("Empregado Mensalista");  
 System.out.println("---------------------------");  
 System.out.print("Nome: ");  
 teclado.nextLine(); // não precisa armazenar a String vazia em uma variável, basta apenas chamar o método para "limpar " o buffer
 String nomeMensalista = teclado.nextLine();  
...
S

Boa, BrunoBastos!

Só pra complementar: http://www.portaljava.com.br:8080/forum/posts/list/40997.page

Abraço!

Criado 1 de julho de 2008
Ultima resposta 2 de jul. de 2008
Respostas 2
Participantes 3