Exception while invoking expression - nullPointerException[Resolvido]

galera, estou esbarrando num erro aqui na hora de um resultado de um calculo…

O erro esta no trecho do codigo abaixo ! ja olhei as variaves…etc etc

Mas nada…

[code]
private BigDecimal calculaTarifa(Set transportadorTarifaCollection, double peso, BigDecimal totalPedido) {
log.debug(“Entrou em calculaTarifa”);
BigDecimal tarifa = new BigDecimal(0);
Iterator it = transportadorTarifaCollection.iterator();
TransportadorTarifa tt = null;
TarifaEntrega te = null;
BigDecimal aux = new BigDecimal(0);
BigDecimal qtde = new BigDecimal(0);
MathContext mc = new MathContext(3);
while (it.hasNext()) {
tt = it.next();
te = tt.getCodTarifa();

        // verificando as condicoes e calculando a tarifa
        log.debug("Cod. Tarifa:" + te.getCodTarifa());
        log.debug("Tipo Tarifa:" + te.getTipoTarifa());
        log.debug("Qdo Cobrar:" + te.getQdoCobrar() + " Igual a 'S'?-" + te.getQdoCobrar().equalsIgnoreCase("S"));
        log.debug("Valor Fixo:" + te.getValorFixo().doubleValue());
        log.debug("Valor total do pedido:" + totalPedido.doubleValue());[/code]

analisando o trace, esta dando erro na linha: log.debug(“Valor total do pedido:” + totalPedido.doubleValue());

alguem tem alguma ideia?

Olha cara, o compilador não ia te sacanear, veja se a referência para jpaResourceBean não está sendo passada nula

Me parece que totalPedido está nulo. E você está tentando pegar o doubleValue de um objeto nulo.

Nos confirme se é isso mesmo.

[quote=Fasagri]Me parece que totalPedido está nulo. E você está tentando pegar o doubleValue de um objeto nulo.

Nos confirme se é isso mesmo.[/quote]

Entao fasari é por ai memso

na real é o seguinte, é calculado um valor normal ate uma faixa de preço, quando chega a 10(quantidade) ele soma uma taxa a mais, a disgrama q o erro só da qdo digitamos exatamente 10 quantidade…se eu digitar 11…ele segue normal :confused:

Bah que beleza!!!

Não deixa ninguém informar a quantidade 10 ignora esse número dentro do sistema hehehe.

Brincadeiras a parte, seria bom se você tivesse como postar o método que popula o seu atributo totalPedido para que possamos ver.
Deve ser um detalhe muito pequeno.

Abraço.

Entao, ai esta o bloco da verificacao…


            // o ultimo pacote aberto eh fechado
            pacotePedido.setNro(nroPacote + "");
            pacotePedido.setPesoTotal(pesoParcial);
            log.debug("Fechado ultimo pacote:" + nroPacote);
            pacotes.add(pacotePedido);

            BigDecimal freteParcial = calcularFretePacote(trans, pacotes, pedido);
            log.debug("Frete parcial (sem taxa veiculos):" + freteParcial);

            // calculo a taxa de entrega da veiculos
            BigDecimal taxaEntregaveiculos = new BigDecimal(controle.getTaxaEntrega());

            BigDecimal valorFreteveiculos = freteParcial.multiply(taxaEntregaveiculos);
            log.debug("Valor frete veiculos:" + valorFreteveiculos);


            BigDecimal freteTotal = new BigDecimal(freteParcial.doubleValue() + valorFreteveiculos.doubleValue(), mc);
            log.debug("Total do frete:" + freteTotal);

            log.debug("Saiu de calcularFrete(...)");
            return freteTotal;


        } finally {
            em.close();
            trans = null;
            itnsPedido = null;
            it = null;
            itemTmp = null;

            produto = null;
            pacotes.clear();
            pacotePedido = null;
            controle = null;
        }
    }

   private PacotePedidoHelper fechaPacote(int nro, Produto produto, long qtde,
            double peso, BigDecimal precoItemPedido) {
        log.debug("FechaPacote:" + nro);
        log.debug("Total do peso do pacote:" + peso);
        PacotePedidoHelper pacotePedido = new PacotePedidoHelper();
        BigDecimal valorTotalPacote = new BigDecimal(0);
        for (int i = 0; i < qtde; i++) {
            pacotePedido.getProdutosPacote().add(produto);
            valorTotalPacote = valorTotalPacote.add(precoItemPedido);

        }
        pacotePedido.setPesoTotal(peso);
        pacotePedido.setNro(nro + "");
        pacotePedido.setValorTotalProdutos(valorTotalPacote);

        return pacotePedido;
    }

    /**
     * Calcula o frete do pacote para a transportadora, cep, estado e peso
     * @param trans
     * @param ra
     * @param pacotes
     * @return
     */
    private BigDecimal calcularFretePacote(Transportadora trans, ArrayList<PacotePedidoHelper> pacotes, Pedido pedido) throws TransportadoraPrecoNotFoundException {

        BigDecimal valorFrete = new BigDecimal(0);
        BigDecimal totalFrete = new BigDecimal(0);

        Iterator<PacotePedidoHelper> it;

        log.debug("Entrou em calcularFretePacote()");

        try {

            it = pacotes.iterator();
            log.debug("Qtde de pacotes:" + pacotes.size());
            PacotePedidoHelper pph;

            while (it.hasNext()) {
                pph = it.next();
                log.debug("Nro do pacote:" + pph.getNro());
                log.debug("Peso do pacote:" + pph.getPesoTotal());
                log.debug("Valor do pacote:" + pph.getValorTotalProdutos());
                log.debug("Qtde produtos no pacote:" + pph.getProdutosPacote().size());
                //TransportadoraPreco tp = buscaTP(trans, ra.getRegiao(), pph.getPesoTotal());
                TransportadoraPreco tp = calcularEntrega(trans, pph.getPesoTotal(), pedido.getEntregaEstado().getUnidfed(), pedido.getEntregaCep());

                BigDecimal frete = tp.getValor();
                log.debug("Frete=" + frete);

                BigDecimal tarifa = calculaTarifa(trans.getTransportadorTarifaCollection(), pph.getPesoTotal(), pph.getValorTotalProdutos());
                log.debug("Tarifa=" + tarifa);

                valorFrete = frete.add(tarifa);
                pph.setFrete(valorFrete);
                log.debug("valorFrete=" + valorFrete);
                log.debug("totalFrete antes =" + totalFrete);
                totalFrete = totalFrete.add(valorFrete);
                log.debug("totalFrete depois =" + totalFrete);
            }



            log.debug("Saiu de calcularFretePacote(...)");
            return totalFrete;

        } finally {
            it = null;
            valorFrete = null;
        }
    }

    /**
     * Calcula o valor da entrega para os dados informados
     * @param trans
     * @param peso
     * @param estado
     * @param cep
     * @return
     * @throws br.com.veiculos.ecommerce.exception.TransportadoraPrecoNotFoundException
     */
    private TransportadoraPreco calcularEntrega(Transportadora trans, double peso, String estado, String cep) throws TransportadoraPrecoNotFoundException {
        log.debug("Entrou em calcularEntrega(" + trans.getCodTransport() + "," + peso + ")");

        EntityManager em = this.jpaResourceBean.getEMF().createEntityManager();

        String cep5caracter = cep.toString();
        long cepBusca = Long.parseLong(cep5caracter.substring(0, 5));
        log.debug("Cep Busca: "+cepBusca);
        
        try {
            Query query = em.createQuery("SELECT t FROM TransportadoraPreco t, RegiaoAbrangencia ra " +
                    " WHERE " +
                    " ra.transportador = :transp AND " +
                    " ((ra.tipoAtendimento = 'E' AND ra.estadual = :estado) OR " +
                    " (ra.tipoAtendimento = 'M' AND ra.cepInicial <= :cep AND ra.cepFinal >= :cep)) AND " +
                    " t.regiao = ra.regiao AND " +
                    " t.transportadora = ra.transportador AND " +
                    " t.pesoAte >= :peso " +
                    " ORDER BY t.pesoAte").setParameter("estado", estado).setParameter("cep", cepBusca).setParameter("transp", trans).setParameter("peso", peso).setMaxResults(1);


            TransportadoraPreco tp = (TransportadoraPreco) query.getResultList().get(0);

            log.debug("Preco encontrado:" + tp.getValor());

            this.prazoEntrega = tp.getRegiaoTrans().getPrazoEntrega();
            log.debug("Prazo encontrado:" + this.prazoEntrega);


            log.debug("Saiu de calcularEntrega");
            return tp;

        } catch (java.lang.IndexOutOfBoundsException e) {
            throw new TransportadoraPrecoNotFoundException("Nao foi encontrado preco para a transportadora:" + trans.getCodTransport() + ", estado:" + estado + ", cep:" + cep + ", peso:" + peso + " informados!");
        } finally {
            em.close();
        }
    }

   
    /**
     * Calcula a tarifa da transportadora para o valor e peso informados
     * @param transportadorTarifaCollection colecao de tarifas da transportadora
     * @param peso Peso total do pedido
     * @param totalPedido Valor total do pedido
     * @return
     */
    private BigDecimal calculaTarifa(Set<TransportadorTarifa> transportadorTarifaCollection, double peso, BigDecimal totalPedido) {
        log.debug("Entrou em calculaTarifa");
        BigDecimal tarifa = new BigDecimal(0.0);
        Iterator<TransportadorTarifa> it = transportadorTarifaCollection.iterator();
        TransportadorTarifa tt = null;
        TarifaEntrega te = null;
        BigDecimal aux = new BigDecimal(0.0);
        BigDecimal qtde = new BigDecimal(0);
        MathContext mc = new MathContext(2);
        while (it.hasNext()) {
            tt = it.next();
            te = tt.getCodTarifa();

            // verificando as condicoes e calculando a tarifa
            log.debug("Cod. Tarifa:" + te.getCodTarifa());
            log.debug("Tipo Tarifa:" + te.getTipoTarifa());
            log.debug("Qdo Cobrar:" + te.getQdoCobrar() + " Igual a 'S'?-" + te.getQdoCobrar().equalsIgnoreCase("S"));
            log.debug("Valor Fixo:" + te.getValorFixo().doubleValue());
            log.debug("Valor total do pedido:" + totalPedido.doubleValue());

           /** nao cobra tarifa */
            if (te.getTipoTarifa().equalsIgnoreCase("F")) {
                if (te.getQdoCobrar().equalsIgnoreCase("V")) {
                    if (totalPedido.doubleValue() > te.getValorMaiorQue().doubleValue()) {
                        aux = te.getValorFixo();
                    }
                    /* */
                } else if (te.getQdoCobrar().equalsIgnoreCase("S")) {
                    aux = te.getValorFixo();
                } else if (te.getQdoCobrar().equalsIgnoreCase("K")) {
                    qtde = new BigDecimal(peso / te.getKilos().doubleValue());
                    qtde = qtde.round(mc);
                    log.debug("Qtde arredondada: " + qtde);
                    aux = qtde.multiply(te.getValorFixo());
                }
           // começo da verificacao do codigo para pac e sedex 1% e 0.5 %

            } else if (te.getTipoTarifa().equalsIgnoreCase("P")) {
                if (te.getQdoCobrar().equalsIgnoreCase("V")) {
                    if (totalPedido.doubleValue() > te.getValorMaiorQue().doubleValue()) {
                        aux = te.getPorcentagemTotal().divide(new BigDecimal(100)).multiply(totalPedido);
                    }
                } else if (te.getQdoCobrar().equalsIgnoreCase("S")) {
                    aux = te.getPorcentagemTotal().divide(new BigDecimal(100)).multiply(totalPedido);
                } else if (te.getQdoCobrar().equalsIgnoreCase("K")) {
                    qtde = new BigDecimal(peso / te.getKilos().doubleValue());
                    qtde = qtde.round(mc);
                    log.debug("Qtde arredondada: " + qtde);
                    aux = qtde.multiply(te.getPorcentagemTotal().divide(new BigDecimal(100)).multiply(totalPedido));
                }
            }

            // fica com o valor maior
            log.debug("tarifa=" + tarifa + " e aux=" + aux);
            if (aux.doubleValue() > tarifa.doubleValue()) {
                tarifa = aux;
            }

        }

        log.debug("Saiu de calculaTarifa");
        return tarifa;
    }

    /** Busca a regiao do frete a ser calculado
     * @param trans Transportadora da regiao
     * @param estado
     * @param cep
     * @return
     * @throws Exception 
     * @throws Exception
     * @deprecated 
     */
    @Deprecated
    private RegiaoAbrangencia buscaRA(Transportadora trans, String estado, String cep) throws RegiaoAbrangenciaNotFoundException {
        log.debug("Entrou em buscaRA");
        EntityManager em = this.jpaResourceBean.getEMF().createEntityManager();
        RegiaoAbrangencia ra = null;

        long cepPedido;

        try {
            cepPedido = Long.parseLong(cep);
        } catch (Exception e) {
            cepPedido = FormatacaoHelper.recuperaValorNumericoCep(cep);
        }


        try {
            // tratando o estado, caso seja nullo
            if (estado == null) {
                log.debug("Procurando estado do cep:" + cep);
                Query query = em.createNamedQuery("EstadoFaixa.recuperaEstado").setParameter("cep", Long.parseLong(cep));
                EstadoFaixa ef = (EstadoFaixa) query.getSingleResult();
                estado = ef.getSigla();
                log.debug("Estado=" + estado);
            }

            log.debug("buscando a RegiaoAbrangencia");
            Query query = em.createNamedQuery("RegiaoAbrangencia.recuperaRA").setParameter("transportadora", trans).setParameter("estado", estado).setParameter("cep", cepPedido);
            log.debug("RegiaoAbrangencia buscada!");

            if (query == null) {
                log.debug("A query eh nula");
            }

            try {
                ra = (RegiaoAbrangencia) query.getSingleResult();
            } catch (javax.persistence.NonUniqueResultException e) {
                ra = (RegiaoAbrangencia) query.getResultList().get(0);
            }
            log.debug("Saiu de buscaRA");

        } catch (javax.persistence.NoResultException e) {
            log.warn("Nao foi encontrada o RegiaoAbrangencia para transportadora=" + trans.getCodTransport() + " estado=" + estado + " ou cep=" + cep);
            throw new RegiaoAbrangenciaNotFoundException(trans.getCodTransport());
        } finally {
            em.close();
        }

        return ra;

    }
}

é neste bloco q faz a verificacao…

nao deu mesmo …

coloca um breakepoint na entrada do método, e olha os valores das variáveis uma a uma.

vou fazer isso julio…valeu pela dica…

Valeu pela dica julio

Achei o erro, no bloco da linha de inicio na 180…

Ele so calcula o valor menor ou maior, quando dava exatamente igual…estourava no NULL…pq ele criava variaveis “vazias”

valeu pela força