NullPointerException when comparing two String arrays in java

0

I have two String arrays and when I run this:

if (prod[i][0].equals(temporaria[j][0]) && prod[i][0]!= null && temporaria[j][0]!= null)

I get NullPointerException without even entering the IF loop.

I found it strange that if you neglect null values.

How is a sales system without data persistence first register the products and put everything in an array called prod.

Main:

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String prod[][] = new String[20][5];

        String cod, nome, desc, qtd, valor;
        boolean continuar = true;
        int escolha, cont_cod = 0;

        System.out.printf("Bem Vindo ao sistema de gerenciamento de loja");

        while (continuar == true) {
            System.out.printf(" \n Selecione uma opção \n 1- Cadastro de Produtos \n 2- Tela de vendas \n 3- Consulta todos produtos \n 4- Sair \n");
            escolha = in.nextInt();
            switch (escolha) {
                //CADASTRO
                case 1:
                    System.out.println("===CADASTRO DE PRODUTOS===");
                    System.out.println("insira o nome do produto");
                    nome = in.next();
                    System.out.println("insira uma descricao do produto");
                    desc = in.next();
                    System.out.println("insira a quantidade do produto");
                    qtd = in.next();
                    System.out.println("insira o valor do produto");
                    valor = in.next();

                    cod = Integer.toString(cont_cod);
                    cont_cod++;

                    Cadastrar.Cadastrar(prod, cod, nome, desc, qtd, valor);//metodo que cadastra na matriz

                    break;

                //===================================================================================//
                //VENDAS
                case 2:

                    Venda.Venda(prod);//metodo de venda

                    break;

                //===================================================================================//
                //CONSULTA DE TODOS OS PRODUTOS                 
                case 3:
                    for (int i = 0; i < prod.length; i++) {
                        if (!(prod[i][0] == null)) {
                            System.out.printf("codigo: " + prod[i][0] + " Produto: " + prod[i][1] + " descricao: " + prod[i][2] + "\n quantidade: " + prod[i][3] + " Valor: R$" + prod[i][4]);
                            System.out.println();
                        }
                    }

                    break;

                //===================================================================================//
                //SAIR
                case 4:
                    System.out.println("saindo da aplicacao, ate mais...");
                    continuar = false;
                    break;
                default:
                    System.out.println("insira apenas um valor válido para escolha(de 1 a 4)");
                    break;
            }
        }
    }
}

}

Class Registration:

public static class Cadastrar {

        public static void Cadastrar(String prod[][], String cod, String nome, String desc, String qtd, String valor) {
            for (int i = 0; i < 19; i++) {
                //para cadastrar o primeiro produto
                if (prod[0][0] == null) {
                    prod[i][0] = cod;
                    prod[i][1] = nome;
                    prod[i][2] = desc;
                    prod[i][3] = qtd;
                    prod[i][4] = valor;
                    //para cadastrar os proximos produtos usando a ultima posicao nao nula do vetor como referencia
                } else if (!(prod[i][0] == null) && prod[i + 1][0] == null) {
                    prod[i + 1][0] = cod;
                    prod[i + 1][1] = nome;
                    prod[i + 1][2] = desc;
                    prod[i + 1][3] = qtd;
                    prod[i + 1][4] = valor;
                    break;
                }

            }
        }
    }

So I compare it to the sales class:

 public static void Venda(String[][] prod) {
        Scanner in = new Scanner(System.in);
        int i, vlr_unit, vlr_tot = 0, qtd_prod, qtd_temp;
        boolean continua = true;
        String confirma, resposta;
        String temporaria[][] = new String[20][2]; //MATRIZ TEMPORARIA PARA SALVAR O "CARRINHO" 
        System.out.println("===VENDA DE PRODUTOS===");

        while (continua == true) {
            for (i = 0; i < 20; i++) {
                System.out.println("insira o codigo do produto: ");
                temporaria[i][0] = in.next();
                System.out.println("insira a quantidade de compra deste produto: ");
                temporaria[i][1] = in.next();
                System.out.printf("deseja inserir outro produto? s ou n \n(respostas diferentes de s ou n serão considerado como nao) \n");
                resposta = in.next();
                if (!(resposta.equals("s"))) {
                    break;
                }
            }
            //IMPRIMINDO O RESUMO DA VENDA PARA CONFIRMACAO
            for (i = 0; i < 20; i++) {
                for (int j = 0; j < 20; i++) {
//O ERRO DO NULLPOINTER OCORRE AQUI NESTE IF
                    if (prod[i][0].equals(temporaria[j][0]) && prod[i][0]!= null && temporaria[j][0]!= null) {
                        qtd_prod = Integer.parseInt(prod[i][3]);
                        qtd_temp = Integer.parseInt(temporaria[j][1]);
                        if (qtd_temp > qtd_prod) { //VERIFICANDO SE HÁ ESTOQUE DISPONIVEL
                            System.out.println("O produto de codigo " + temporaria[j][1] + " possui quantidade insuficiente para venda requisitada");
                        } else {
                            //TRANSFORMANDO OS VALORES DOS PRODUTOS PARA INTEIRO PARA PODER CALCULAR PRECO UNITARIO E TOTAL
                            vlr_unit = Integer.parseInt(prod[i][4]);
                            vlr_tot += vlr_unit * (Integer.parseInt(temporaria[j][1]));
                            System.out.printf("codigo: " + prod[i][0] + " Produto: " + prod[i][1] + "\n quantidade: " + temporaria[j][1] + " Valor: R$" + prod[i][4]);
                        }
                    }
                }
            }

            System.out.println("Valor total da compra: " + vlr_tot);
            System.out.println();
            System.out.println("Confirma compra? s ou n");
            confirma = in.next();

            //EFETUANDO AS ALTERACOES NA MATRIZ DE PRODUTOS DANDO BAIXA NOS PRODUTOS VENDIDOS               
            if (confirma.equals("s")) {
                for (i = 0; i < 20; i++) {
                    for (int j = 0; j < 20; i++) {
                        if (prod[i][0]!= null && temporaria[j][0]!=null && prod[i][0].equals(temporaria[j][0])) // SE O CODIGO DO PROD EM ESTOQUE E NO CARRINHO FOR IGUAL
                        {
                            qtd_prod = Integer.parseInt(prod[i][3]);
                            qtd_temp = Integer.parseInt(temporaria[j][1]);
                            if (qtd_temp < qtd_prod) {
                                //CONVERSAO DA QUANTIDADE PARA INTEIRO A FIM DE CALCULAR A NOVA QTD EM ESTOQUE

                                qtd_prod -= qtd_temp;
                                prod[i][3] = Integer.toString(qtd_prod);

                            }
                        }
                    }
                }
            } else {
                System.out.println("cancelando venda...");
                continua = false;
            }

        }
    }
    
asked by anonymous 08.09.2016 / 23:03

1 answer

1

Your problem is here:

//IMPRIMINDO O RESUMO DA VENDA PARA CONFIRMACAO
        for (i = 0; i < 20; i++) {
            for (int j = 0; j < 20; i++) {
//O ERRO DO NULLPOINTER OCORRE AQUI NESTE IF{

You are incrementing the variable i and not j . So when you try to access the array by telling i, since the internal loop comparison condition is j, i reaches the value 20 and access to that matrix position that does not exist causes the NPE. To correct it, just put j to be incremented:

for (int j = 0; j < 20; j++) {
    
09.09.2016 / 02:21