Classe Scanner

Senhores, boa noite.Preciso da ajuda dos senhores.
Bom, estou fazendo um programa bem básico para comecar a enteder essa mundo Java, porem nao estou conseguindo o resultado que quero.
Segue o codigo.

import java.util.*;

public class Main {

	public static void main(String[] args)  {
		
		
		//usando a classe Scanner
		Scanner sc = new Scanner(System.in);
			
		
		double total=0;//inicializando as variaveis
		int qtd,qtdtotal=0,registro = 0,resposta;
		double valor,subsoma;
		String material;
		
		System.out.println("BEM-VINDO");
		resposta = 1;

		/*usando estrutura de repeticao while,forçando pelo menos
		uma execução*/
				
		while (resposta == 1){
			
		System.out.println("Nome do Produto:   ");
		material = sc.next();
	
		System.out.println("Preço:  ");
		valor = sc.nextDouble();
		 
		System.out.println("quantidade:  ");
		qtd = sc.nextInt();
		
		subsoma = (valor*qtd);
				
		System.out.println("Subtotal do  Item  é: "+ "R$ " + subsoma);
			
		registro++;

		total=subsoma+total;
		qtdtotal=qtd+qtdtotal;
		
		System.out.println("Deseja cadastrar produto?1-sim 2-nao");
		resposta = sc.nextInt();
		
		}	
	
		System.out.println("********************************");
		System.out.println("Valor total e R$   " +      total);
		System.out.println("Total de Registros:   " + registro);
		System.out.println("Quantidade total de produtos  " + qtdtotal);
		System.out.println("********************************");
	
	}

}

O que esta acontecendo é que quando o nome de um produto é composto (ex: caneta azul) da erro.
Porem, quando uso o nextLine(), a primeira passagem é tranquilo mas quando ele volta para uma segunda passagem, pula o comando de entrada do Nome e já entra no preço.
bom, comprei o livro Java como programar e nem nele eu consegui achar uma solução, se alguem puder me ajudar.
grande abraço.

import java.util.*;

public class Main {

	public static void main(String[] args)  {
		
		
		//usando a classe Scanner
		Scanner sc = new Scanner(System.in);		
		double total=0;//inicializando as variaveis
		int qtd,qtdtotal=0,registro = 0,resposta;
		double valor,subsoma;
		String material;
		
		System.out.println("BEM-VINDO");
		resposta = 1;

		/*usando estrutura de repeticao while,forçando pelo menos
		uma execução*/
				
		while (resposta == 1){
			
		System.out.println("Nome do Produto:   ");
		material = sc.nextLine();
	
		System.out.println("Preço:  ");
		valor = sc.nextDouble(); sc.nextLine();
		 
		System.out.println("quantidade:  ");
		qtd = sc.nextInt(); sc.nextLine();
		
		subsoma = (valor*qtd);
				
		System.out.println("Subtotal do  Item  é: "+ "R$ " + subsoma);
			
		registro++;

		total=subsoma+total;
		qtdtotal=qtd+qtdtotal;
		
		System.out.println("Deseja cadastrar produto?1-sim 2-nao");
		resposta = sc.nextInt(); sc.nextLine();
		
		}	
	
		System.out.println("********************************");
		System.out.println("Valor total e R$   " +      total);
		System.out.println("Total de Registros:   " + registro);
		System.out.println("Quantidade total de produtos  " + qtdtotal);
		System.out.println("********************************");
	
	}

}

eu achei uma solução em um outro tópico, após cada leitura do scanner com um valor inteiro ou double, ele faz um sc.nextLine(), que seria parecido com limpar o buffer em c, pelo menos foi o que eu entendi, isto resolve o problema, mais nao sei se é a maneira mais correta de fazer. abraços

Bom, so modifquei a última linha e funcionou…

System.out.println("Deseja cadastrar produto?1-sim 2-nao");
		resposta = sc.nextInt();sc.nextLine();

também nao sei se é o correto mas essa “gambiarra” funcionou…rss
obrigado…

Quando você usa a classe Scanner, o único método que você deve usar para ler do Console é o nextLine().
Ele é o único que procura até o \n ou \r\n em todos os casos. Os outros métodos, como você constatou, podem deixar lixo no scanner, e gerar esse comportamente esquisito.

Leia com o nextLine() e use métodos como Integer.parseInt e Double.parseDouble para converter o tipo de dado retornado.