Ir para conteúdo
Fórum Script Brasil
  • 0

Erro no Código


startour

Pergunta

alguém pode me ajudar, tem um erro nesse código e não sei qual é 

package exerciciovetor2b;

import java.util.Scanner;

public class ExercicioVetor2B {

      public static void main(String[] args) {
        
          Scanner entrada = new Scanner(System.in);
          Produto [] cadastro = new Produto[5];
          Produto aux_produto = new Produto();
          
          //carregando o vetor cadastro
          for(int i=0; i<= 4; i++){
              System.out.print("Digite o codigo do produto......: ");
              aux_produto.codigo = entrada.nextInt();
              System.out.print("Digite a descrição do produto...: ");
              aux_produto.descricao = entrada.next();
              System.out.print("Digite o valor do produto.......: ");
              aux_produto.valor = entrada.nextFloat();
              cadastro[i] = aux_produto;
          }
          
          // exibindo o vetor cadastro
          for(int i=0; i<= 4; i++){
              System.out.println("Código ......: " + cadastro[i].codigo);
              System.out.println("Descrição ...: " + cadastro[i].descricao);
              System.out.println("Valor (R$)...: " + cadastro[i].valor);
            
          }
    }
}
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Olá, @startour Seu post é foi criado em maio e sinto muito em não ter recebido uma resposta

Porém, achei interessante falar d uma questão referente ao que está acontecendo e q, provavelmente, seja uma das causas do erro em seu código (Sendo sincero parece q estou falando sozinho aqui já q o tópico foi criado em maio rs...) 

A questão q gostaria de frisar, para quem tiver interesse de aprender sobre esse assunto diz respeito a sujeira no buffer. Acredito q p muitos que estudam ou mesmo trabalham com Java isso seja algo até então um assunto desconhecido, e até acho isso normal, pois comigo mesmo foi assim, ou seja, durante o tempo q estudei Java, não aprendi a respeito desse assunto 

Ao usar o Scanner do modo como está sendo feito no código do @startour inevitavelmente vai dar erro, ou seja, não vai ser possível fazer tantas leituras do teclado sem q sujeira no buffer interfira nessas leituras e provoque erro. A classe Scanner, do modo como está sendo usada no código acima até pode funcionar em códigos onde são feitas poucas leituras do teclado, mas no caso acima não funciona

Uma maneira de lidar com esse problema em Java (sujeira no buffer) é criar métodos próprios para fazer a leitura do teclado de um valor inteiro, de uma String, de um valor de ponto flutuante (float ou double), etc... de maneira adequada

Segue como ficaria o código já com os métodos q aprendi a criar para resolver o exercício:

Classe Produto:


public class Produto {

    private int codigo;
    private String descricao;
    private double valor;

    public Produto(int codigo, String descricao, double valor) {
        this.codigo = codigo;
        this.descricao = descricao;
        this.valor = valor;
    }

    public int getCodigo() {
        return codigo;
    }

    public String getDescricao() {
        return descricao;
    }

    public double getValor() {
        return valor;
    }
}

Classe principal, com o método main:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Aplicacao {

    private static final int QTDE = 5;

    public static void main(String[] args) {

        Produto[] produtos = new Produto[QTDE];
        int codigo;
        String descricao;
        double valor;

        for (int i = 0; i < produtos.length; i++) {
            System.out.print("Digite o codigo do produto " + (i + 1) + "....: ");
            codigo = readInt();
            System.out.print("Digite a descrição do produto...: ");
            descricao = readString();
            System.out.print("Digite o valor do produto.......: ");
            valor = readDouble();

            produtos[i] = new Produto(codigo, descricao, valor);
        }

        System.out.println();

        for (int i = 0; i < produtos.length; i++) {
            System.out.println("Código ......: " + produtos[i].getCodigo());
            System.out.println("Descrição ...: " + produtos[i].getDescricao());
            System.out.println("Valor (R$)...: " + produtos[i].getValor());
            System.out.println();
        }

    }

    // método para ler uma String
    public static String readString() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            return reader.readLine();
        } catch (IOException e) {
            throw new RuntimeException("Erro ao ler o dado do teclado");
        }
    }

    // método para ler um valor inteiro
    public static int readInt() {
        String str = readString();
        try {
            return Integer.parseInt(str);
        } catch (NumberFormatException e) {
            throw new RuntimeException(str + " não é um int válido");
        }
    }

    // método para ler um double
    public static double readDouble() {
        String str = readString();
        try {
            return Double.parseDouble(str);
        } catch (Exception e) {
            throw new RuntimeException(str + " não é um double válido");
        }
    }

}

Usando esses métodos, por exemplo, para ler de maneira adequada determinado valor do teclado, se resolve o problema de sujeira no buffer

Se alguém tiver interesse em saber do problema de fazer uso da classe Scanner do modo como está sendo feito no código do @startour recomendo testar o mesmo código do modo como o autor do tópico está fazendo, na parte de ler os valores do teclado. A classe Scanner não é adequada para fazer a leitura de determinado valor do teclado, e devido a isso, se usar essa classe do forma como o autor postou o código inevitavelmente vai dar erro e não será possível cadastrar todos os produtos

Também quero deixar claro q não culpo o @startour por esse erro, até mesmo porque eu nem estaria apto para isso, pois eu mesmo fazia dessa forma quando estudava Java, e acredito que, para muita gente que estuda Java, se trata de um assunto desconhecido

OBS: Só fui aprender realmente a respeito disso q estou falando (sujeira no buffer) quando comecei a estudar o C, pois no C, logo nos primeiros códigos q a gente cria, esse problema referente a sujeira no buffer já aparece, e, devido a isso, a gente é "obrigado" a aprender a lidar com essa questão logo cedo

Para quem quiser entender melhor sobre o assunto recomendo esse vídeo (ele se refere ao C, mas o mesmo princípio se aplica para o Java):

Limpar o Buffer do teclado - vídeo 

 

Editado por Visitante
correção no código
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...