Scanner "pulando etapas"

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:

[code]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;
}

}
[/code]

[code]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();

}

}
[/code]

troque:

produtos.setPreco(scanner.nextDouble());

por :

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

Muito Obrigado douglaskd, troquei e funcionou.

Mas porque da mudança ?

[quote=luiz_rossini]Muito Obrigado douglaskd, troquei e funcionou.

Mas porque da mudança ?[/quote]

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.

Hmm… entendi…

Muito obrigado !