Nullpointerexception when comparing two String arrays in java

Asked

Viewed 54 times

0

I have two String matrices and when executing this:

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

get Nullpointerexception without at least entering the IF loop.

I found strange precisely by the if disregard null values.

As it is a sales system without data persistence first register the products and put everything in a matrix 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 Cadastrar:

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 in the sale 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;
            }

        }
    }
  • 1

    So the problem isn’t even there, add the whole code for better analysis.

  • Post the code of this String array?

  • ready, added

  • You don’t have to go into if to give NPE. If prod[i][0] for null, call for equals in it will certainly cause the error.

  • so I have to use == ?

  • First one should always check if the object is null, then do any check on it.

Show 1 more comment

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 the j. With this, when you try to access the matrix informing i, how the comparison condition of the internal loop is j, i reaches the value 20 and access to this position of the Matrix that does not exist causes the NPE. To fix just put the j to be incremented:

for (int j = 0; j < 20; j++) {
  • That’s what it was, something so simple. Thank you

Browser other questions tagged

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