NullPointerException, Duvida

Galera, boa noite.

  por favor, como faço para resolver este problema de "NullPointerException".

Eu estou usando Hibernate 3.2 e struts, e sempre ocorre este problema quando estou resgatando um valor do Banco de Dados ou quando estou cadastrando.

Alguem pode me dar uma ajuda.

Obrigado

Sempre que tiver algum problema, erro ou exceção, procure dar mais informações tipo, a stack trace do problema, o trecho do código que está ocasionando o erro, isso facilita e muito na hora de ajudar.

Primeiramente Obrigado por me ajudar, valeu mesmo.

Então eu ja estou usando o e.printStackTrace();

vou postar o erro.

org.hibernate.PropertyAccessException: Exception occurred inside setter of org.cerbisoriani.business.general.Endereco.complemento
        at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:65)
        at org.hibernate.tuple.entity.AbstractEntityTuplizer.setPropertyValues(AbstractEntityTuplizer.java:337)
        at org.hibernate.tuple.entity.PojoEntityTuplizer.setPropertyValues(PojoEntityTuplizer.java:200)
        at org.hibernate.persister.entity.AbstractEntityPersister.setPropertyValues(AbstractEntityPersister.java:3514)
        at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:129)
        at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
        at org.hibernate.loader.Loader.doQuery(Loader.java:717)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
        at org.hibernate.loader.Loader.doList(Loader.java:2211)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
        at org.hibernate.loader.Loader.list(Loader.java:2090)
        at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:95)
        at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
        at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
        at org.cerbisoriani.application.cliente.ClienteAction.getDBObject(ClienteAction.java:373)
        at org.cerbisoriani.application.cliente.ClienteAction.formAddCliente(ClienteAction.java:357)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:266)
        at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:167)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:413)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:225)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:446)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
        at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
        at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
        at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.hibernate.property.BasicPropertyAccessor$BasicSetter.set(BasicPropertyAccessor.java:42)
        ... 44 more
Caused by: java.lang.NullPointerException
        at org.cerbisoriani.business.general.Endereco.setComplemento(Endereco.java:81)
        ... 49 more

Coloque um breakponit na classe Endereco na linha 81 e veja se o que você está recebendo não é null

org.cerbisoriani.business.general.Endereco.setComplemento(Endereco.java:81)

Verifique se você mapeou certo a sua classe com a tabela, e se há resultados.

Sim, o Valor que esta recebendo é null.

Como posso contornar este erro?

Obrigado

coloque um if antes de chamar a gravação no banco… algo do tipo.

if (x==null) x=0;

acho que esse problema é porque o campo da sua tabela não aceita valores nulos

Você deve estar limpando em alguma parte do seu código essa variavel, ou simplesmente não deve estar alimentando…
Analize e deu uma olhada em seu código, veja se está ou não fazendo isso… tá?! depois retorne aqui no forum…

Tchau

Bom dia Lina e a todos do Guj.

Então, este valor (Complemento) pode assumir valores vazios, visto que no banco de dados o campo complemento não é obrigatório.

O método get e set do Complemento esta correto e igual aos demais campos.

eu tb estou usando o método trim() e toUpperCase()

esta assim

public String getComplemento() {
         return this.complemento.trim().toUpperCase();
}

public void setComplemento(String $complemento) {
         this.complemento = $complemento.trim().toUpperCase();
}

Abraços

Caused by: java.lang.NullPointerException
         at org.cerbisoriani.business.general.Endereco.setComplemento(Endereco.java:81)

Na verdade, vc deve verificar porque o objeto esta chegando null até esse ponto ai, se ele não pode chegar null, então precisa fazer um debug em todo o processo anterior pra detectar o ponto que deveria estar sendo atribuido algun valor ao objeto mas esta lhe retornando null.

Debug é a melhor escolha. :slight_smile:

[quote=XFlameBR]public void setComplemento(String $complemento) {
this.complemento = $complemento.trim().toUpperCase();
}
[/quote]

Faça o seguinte:

public void setComplemento(String complemento) {
         if (complemento != null) {
                  this.complemento = complemento.trim().toUpperCase();
         } else {
                  this.complemento = "";
         }
}

Não é muito bom ficar trafegando objetos nulos, mas outra alternativa é deixar o objeto como null, e SE OBRIGAR a sempre tratar (verificar se o objeto é null) toda vez que for acessá-lo.

PS: por que ta usando $ como sufixo de seus parametro? apesar da linguagem suportar essa nomenclatura, não é uma boa prática :wink:

Bom,
então se realmente no seu no banco de dados o campo complemento não é obrigatório… faça a verificação do nullo antes… se nullo mande vazio… bem assim como o Luiz e outras pessoas ja falaraum…

Tchauzin

então Galera, o mais estranho é que o erro estava ocorrendo quando pegava informação do banco.

Tenta fazer um debug pra ver porque não está setando o valor correto, porque teoricamente o set esta passando null como parâmetro.

Luiz Aguiar, Obrigado pela ajuda.

   o metodo set quando não é passado nem um valor seu valor seria null, mas se vindo de um formulário HTML seu valor seria "", correto?

Como vc esta recuperando esse dado da página? request, form, etc…
Mas assumi-se “” sim.

Este codigo eu estou usando para montar o Formulario

public ActionForward formAddCliente(ActionMapping mapping, ActionForm form,
345             javax.servlet.http.HttpServletRequest request,
346             javax.servlet.http.HttpServletResponse response)
347             throws Exception {
348        try {
349
350            HttpSession sessaoHttp = request.getSession();
351
352            sessaoHttp.setAttribute("categorias",this.getDBObject(Categoria.class));
353            sessaoHttp.setAttribute("endtipos",this.getDBObject(EndTipo.class));
354            sessaoHttp.setAttribute("cidades",this.getDBObject(Cidade.class));
355            sessaoHttp.setAttribute("ramos",this.getDBObject(Ramo.class));
356            sessaoHttp.setAttribute("unidades",this.getDBObject(Unidade.class));
357
358            return mapping.findForward("FormAddCliente");
359         }catch (Exception e) {
360            e.printStackTrace();
361            return mapping.findForward("fail");
362        }
363    }

Este codigo busca os Objetos no Banco de dados para que eu possa montar o Formulario de Cadastro do Cliente

 public List getDBObject(Class className) {
366
367        Session session = HibernateUtil.getSession();
368        Transaction transaction = session.beginTransaction();
369        try {
370             Criteria criteria = session.createCriteria(className);
371
372             List object = criteria.list();
373
374             transaction.commit();
375             session.close();
376             return object;
377        }catch (Exception e) {
378
379            e.printStackTrace();
380            return null;
381        }
382
383    }
 ClienteForm addCliente = (ClienteForm) form;

String complemento = addCliente.getComplemento();


endereco.setComplemento(complemento);

Abraços

Eu acredito que não. Você não pode confiar 100% nisso, já que o campo não é obrigatório na tua action (a que recebe os dados do form para gravar no banco) verifique se os atributos que não são obrigatórios foram preenchidos, os que não foram, passe uma string vazia. O que pode estar acontecendo é o seguinte: Como os campos obrigatórios não estão sendo validados, logo está sendo gravado null no banco, e quando você usa o trim() dá um NPE justamente por isso.

Nunca confie nos dados de entrada, isso faz com que você tenha uma base de dados íntegra.

Abraços e um ótimo 2007