Scanner "pulando etapas"

4 respostas
L

Bom dia gujizadas...

Estava fazendo um teste por conta própria, para praticar mesmo e me deparei com um probleminha.

Com Scanner, peço para ser digitado um nome e um preço de um produto. Primeiro nome, depois produto. Depois, adiciona a uma lista de produtos.

A primeira passagem ocorre sem problemas, mas na segunda, é printado as duas mensagens, para digitar o nome do produto e o preço do produto, porém se eu digitar o nome da pau.

Alguém sabe me explicar o porque?

Segue códigos:

public class ProdutosBean {

	private String nome = null;
	private long serie = 0;
	private double preco = 0.0;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public long getSerie() {
		return serie;
	}

	public void setSerie(long serie) {
		this.serie = serie;
	}

	public double getPreco() {
		return preco;
	}

	public void setPreco(double preco) {
		this.preco = preco;
	}
}
package Exercicios;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class TesteListProdutosScanner {

	private List<ProdutosBean> listaProdutos = new ArrayList<ProdutosBean>();

	public TesteListProdutosScanner(){
		preencheLista();
		imprimiListaProdutos();
	}
	
	public void preencheLista(){
		Scanner scanner = new Scanner(System.in);
		for(int c = 0; c < 10; c++){
			ProdutosBean produtos = new ProdutosBean();
			try{
				System.out.println("Digite o nome do produto: ");
				produtos.setNome(scanner.nextLine());
				System.out.println("Digite o preço do produto: ");
				produtos.setPreco(scanner.nextDouble());
				produtos.setSerie(criaNumeroSerie());
				listaProdutos.add(produtos);
			}catch(Exception  e){
				System.out.println(e.getMessage());
			}		
		}
	}
			
	public long criaNumeroSerie(){
		Random rand = new Random();
		long numero  = rand.nextLong();
		return numero;
	}
	
	public void imprimiListaProdutos(){
		for(ProdutosBean produtos : listaProdutos){
			System.out.println("Nome: " + produtos.getNome());
			System.out.println("Serie: " + produtos.getSerie());
			System.out.println("Preço R$: " + produtos.getPreco());
		}
	}
	
	public static void main(String[] args) {
		new TesteListProdutosScanner();

	}

}

4 Respostas

douglaskd

troque:

produtos.setPreco(scanner.nextDouble());

por :

produtos.setPreco( Double.ParseDouble( scanner.nextLine() ) );

L

Muito Obrigado douglaskd, troquei e funcionou.

Mas porque da mudança ?

douglaskd

luiz_rossini:
Muito Obrigado douglaskd, troquei e funcionou.

Mas porque da mudança ?

dentro do scanner existe uma string.

o nextLine, recebe a linha e retorna o ponteiro para o inicio do scanner.

ja o nextDouble, lê a String digitada anteriormente em busca de doubles, e não retorna para o inicio do scanner.

uma forma de “gambiarrar” isso é recriar um scanner limpo, logo abaixo do nextDouble()

scanner = new Scanner(System.in);

mas… sinceramente falando é a pior coisa a se fazer, o next(algumaCoisa) serve para você pesquisar dados dentro de uma String…Arquivo, como a Classe Scanner foi Reutilizada porcamente para entradas de usuário acaba ocorrendo esse bug. pois ele fica “preso” dentro da string do Scanner.

L

Hmm… entendi…

Muito obrigado !

Criado 4 de março de 2013
Ultima resposta 4 de mar. de 2013
Respostas 4
Participantes 2