Exception error in thread "main" in my Array

Asked

Viewed 77 times

0

Guys, help me, I can’t find the error in my code. I know this error refers to not having the position in the array to store but I don’t know where to fix it.

package br.com.fiap.exercicios.lista2.exercicio2;
import java.util.Scanner;

public class Produto {

private int quantidade;
private double preco;
private double desconto;
Scanner teclado = new Scanner(System.in);

public int getQuantidade() {
    return quantidade;
}
public void setQuantidade(int quantidade) {
    this.quantidade = quantidade;
}
public double getPreco() {
    return preco - ((this.desconto/100)*this.preco);
}
public void setPreco(double preco) {
    this.preco = preco;
}
public double getDesconto() {
    return desconto;
}
public void setDesconto(double desconto) {

    int contador = 0;
    while(contador != 1){
        if(desconto > 100 || desconto < 0){
            System.out.println("Entre com um desconto válido, descontos variam de 0 - 100%.");
            desconto = teclado.nextDouble();
            this.desconto = desconto;
        }else{
            this.desconto = desconto;
            contador = 1;
        }
      }

   }

}

The mistake:

Exception in thread "main" java.lang.Nullpointerexception at br.com.Fiap.exercicios.Lista2.exercicio2.Teste.main(Test.java:20)

appears after I type the price in the loop, on the highlighted line below

package br.com.fiap.exercicios.lista2.exercicio2;
import java.util.Scanner;

public class Teste {

public static void main(String[] args){

    Produto[] carrinho = new Produto[1000];
    Scanner scanner = new Scanner(System.in);
    int n;
    double precoTotal = 0;

    System.out.println("Quantos produtos você deseja comprar?");
    n = scanner.nextInt();

    for(int i = 0; i < n; i++){

        System.out.println("Entre com a quantidade do produto " + i+1 + ":");
        int quantidade = scanner.nextInt();
        carrinho[i].setQuantidade(quantidade);

        System.out.println("Entre com o  valor do produto " + i+1 + ":");
      double preco = scanner.nextDouble();// o erro ocorre aqui
        carrinho[i].setPreco(preco);
        System.out.println("Entre com o desconto do produto " + i+1 + " caso haja:");
        double desconto = scanner.nextDouble();
        carrinho[i].setDesconto(desconto);

    }

    for(int i = 0; i < n; i++){
        precoTotal += carrinho[i].getPreco();
    }

    System.out.println("O valor total da compra é de R$" + precoTotal);
}

}
  • Your code has a serious logic error: if I pass 2000 products to buy, it will pop the size set pro array and launch ArrayIndexOutOfBoundsException. Or you limit the purchase amount before entering for or switch to a dynamic array, such as the lists(arraylist for example) in the Collections package. As for the error, check if the line you indicate is actually that of the error, there is nothing wrong, apparently, until the line marked

1 answer

1


Good afternoon, as your problem, you can solve by putting carrinho[i] = new Produto(); just below your for, a point of attention is with respect to the array you are using, Produto[] carrinho = new Produto[1000]; vc is limited to 1000 elements, you can switch to a Collection, ArrayList for example.

follows below the correction

public class Teste {

    public static void main(String[] args) {

        Produto[] carrinho = new Produto[1000];
        Scanner scanner = new Scanner(System.in);
        int n;
        double precoTotal = 0;

        System.out.println("Quantos produtos você deseja comprar?");
        n = scanner.nextInt();

        for (int i = 0; i < n; i++) {
            // Inicia uma nova instância para a posicao i de seu array
            carrinho[i] = new Produto();

            System.out.println("Entre com a quantidade do produto " + i + 1 + ":");
            int quantidade = scanner.nextInt();
            carrinho[i].setQuantidade(quantidade);

            System.out.println("Entre com o  valor do produto " + i + 1 + ":");
            double preco = scanner.nextDouble();
            carrinho[i].setPreco(preco);

            System.out.println("Entre com o desconto do produto " + i + 1 + " caso haja:");
            double desconto = scanner.nextDouble();
            carrinho[i].setDesconto(desconto);

        }

        for (int i = 0; i < n; i++) {
            precoTotal += carrinho[i].getPreco();
        }

        System.out.println("O valor total da compra é de R$" + precoTotal);
    }

}

If you want to change to Collection for example you could do it as follows:

public class Teste {

    public static void main(String[] args) {

        List<Produto> carrinho = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        int n;
        double precoTotal = 0;

        System.out.println("Quantos produtos você deseja comprar?");
        n = scanner.nextInt();

        for (int i = 0; i < n; i++) {
            // cria uma nova instancia de produto
            Produto produto = new Produto();

            System.out.println("Entre com a quantidade do produto " + i + 1 + ":");
            int quantidade = scanner.nextInt();
            produto.setQuantidade(quantidade);

            System.out.println("Entre com o  valor do produto " + i + 1 + ":");
            double preco = scanner.nextDouble();
            produto.setPreco(preco);

            System.out.println("Entre com o desconto do produto " + i + 1 + " caso haja:");
            double desconto = scanner.nextDouble();
            produto.setDesconto(desconto);

            // adiciona a collection de produtos
            carrinho.add(produto);

        }

        for (int i = 0; i < n; i++) {
            precoTotal += carrinho.get(i).getPreco();
        }

        System.out.println("O valor total da compra é de R$" + precoTotal);
    }

}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.