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
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.