Galera, to seguindo a apostila FJ21 da Caelum e em dado momento a apostila diz para converter uma data, porém a formatação dá erro nullPointerException… só que ela acusa uma linha que esta dentro do try/catch, e ao inves de lançar a exceção que eu criei no catch lança o null… Sou ainda iniciante e nunca passei por nada parecido e não faço ideia do que possa ser. Embora compreenda que nullPointer indica um apontamento para uma variavel nula, esse codigo esta exatamente IGUAL ao da apostila, e a linha em questao esta tratada. Existe alguma coisa que estou deixando passar, se puderem me ajudar seria eternamente grato!
Segue classe que contem a linha identificada como erro [nota que a IDE diz que o arquivo nao possui erros]
`packagebr.com.caelum.servlet;`importjava.io.IOException;importjava.io.PrintWriter;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importbr.caelum.jdbc.modelo.Contato;importbr.com.caelum.jdbc.dao.ContatoDAO;`@WebServlet("/adicionaContato")publicclassAdicionaContatoServletextendsHttpServlet{/** * */privatestaticfinallongserialVersionUID=1L;`@Overrideprotectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();// pegando os parâmetros do RequestStringnome=request.getParameter("nome");Stringendereco=request.getParameter("endereco");Stringemail=request.getParameter("email");StringdataTexto=request.getParameter("dataNas");CalendardataNas=null;// fazendo a conversão da datatry{Datedate=newSimpleDateFormat("dd/MM/yyyy").parse(dataTexto);//Esta é a linha 44 onde o compilador diz que o erro está acontecendodataNas=Calendar.getInstance();dataNas.setTime(date);}catch(ParseExceptione){out.println("Erro de conversão da data");return;// para a execução do método}// monta um objeto contatoContatocontato=newContato();contato.setNome(nome);contato.setEndereco(endereco);contato.setEmail(email);contato.setDataNas(dataNas);// salva o contatoContatoDAOdao=newContatoDAO();dao.adiciona(contato);// imprime o nome do contato que foi adicionadoout.println("<html>");out.println("<body>");out.println("<Contato>"+contato.getNome()+"adicionado com sucesso");out.println("</body>");out.println("</html>");}
O parâmetro dataNas está sendo enviado ? Aparentemente é isso que está acontecendo. Debugue o código e veja se está vindo valor do request.
Para capturar o nullpointer no seu catch você deve adiciona-lo:
}catch(ParseExceptione){
out.println("Erro de conversão da data");return; // para a execução do método
}catch(NullPointerExceptionen){
out.println("Null");
}
Rodrigo_Void
Olá, para dar nullPointer nesta linha sua variável dataTexto deve estar nula, verifique se de fato está setando um valor nela, se o parametro não vem nulo.
Obs.: verificar quer dizer comprovar em debug, não olhar o código.
C
CavalierWorks
Cara, a pagina html nem chega a carregar, quando eu dou “run on server” o html carrega com o erro que eu printei aqui.
Sobre debugar e o valor estar nulo, eu nao sei fazer isso muito bem, mas de qualquer forma o codigo esta absolutamente igual ao jeito que esta na apostila.
Em todo caso, como faço pra debugar do jeito que vc falou?
C
CavalierWorks
Cara, vou tentar fazer isso. Não sei bem como. De qqr forma o codigo esta igual ao da apostila, vou colocar aqui
2 formas: o debug correto é rodar ele em modo de depuração, tem um botão geralmente do lado do play.
Ou simplesmente printa no console a variável.
Não quer dizer que estando igual deve rodar igual, tem muita coisa que pode ser diferente, como isto é um método de requisição, o problema é que a request não está mandando o valor, logo, não faz diferença se o código tá igual.
Rodrigo_Void
bom, igual, igual não está, vc alterou o nome dos parametros.
99% de certeza que vc n está recebendo o valor do parametro, confira oq está mandando e oq está recebendo.
C
CavalierWorks
Cara, eu mudei agora justamente pra ter certeza de que não estava cometendo um erro do tipo “dataNacsimento” ou algo assim, então troquei por algo que ficasse mais facil de identificar em uma primeira vista. Mas antes disso tambem tentei com os parâmetros iguais.
Vou tentar debugar aqui e ver o que acontece.
Po brigado pela força gurizada, vcs tão ajudando muito!
Ja respondo o que rolou
RenanRosa
O seu código estava dentro de uma página JSP ?
Então pode ser que não esteja carregando a página porque não tem o parâmetro dataNascimento.
Adicione o catch que falei para poder carregar a página, ou então verifique antes de fazer a conversão:
Repara que agora ele falou que o problema ta no contatoDAO e na outra classe.
Aqui segue o codigo do ContatoDAO
packagebr.com.caelum.jdbc.dao;importjava.sql.Connection;importjava.sql.Date;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.Calendar;importjava.util.List;importbr.caelum.jdbc.ConnectionFactory;importbr.caelum.jdbc.modelo.Contato;publicclassContatoDAO{privateConnectionconnection;publicContatoDAO(){this.connection=newConnectionFactory().getConnection();}publicvoidadiciona(Contatocontato){Stringsql="insert into contatos"+"(nome, email, endereco, dataNas)"+"values(?,?,?,?)";try{// Prepared Statement para inserçãoPreparedStatementstmt=connection.prepareStatement(sql);// Seta os valoresstmt.setString(1,contato.getNome());stmt.setString(2,contato.getEmail());stmt.setString(3,contato.getEndereco());stmt.setDate(4,newDate(contato.getDataNas().getTimeInMillis()));//Essa é a linha 36 onde o compilador acusa o erro// Executa e fechastmt.execute();stmt.close();}catch(SQLExceptione){thrownewRuntimeException(e);}}publicList<Contato>getLista(){try{List<Contato>contatos=newArrayList<Contato>();PreparedStatementstmt=this.connection.prepareStatement("select * from contatos");ResultSetrs=stmt.executeQuery();while(rs.next()){// Criando o objeto contatoContatocontato=newContato();contato.setId(rs.getLong("id"));contato.setNome(rs.getString("nome"));contato.setEmail(rs.getString("email"));contato.setEndereco(rs.getString("endereco"));// montando a tela atraves do calendarCalendardata=Calendar.getInstance();data.setTime(rs.getDate("dataNascimento"));contato.setDataNas(data);// adicionando objetos a listacontatos.add(contato);}rs.close();stmt.close();returncontatos;}catch(SQLExceptione){thrownewRuntimeException(e);}}
}
Rodrigo_Void
Provavelmente aqui.
Se vc fez o if pra ignorar a data caso ela não venha, a var continuou nula, e agora estoura ali. Empurrou o problema com a barriga. Vc precisa resolver seu problema da request antes.
C
CavalierWorks
Cara, não fiz if, só segui o jeito que tava na apostila.
Olha só, eu tratei todas as linhas que o compilador acusava como erro e olha o que o navegador apresenta agora.
Vc n disse q fez aquilo que o Renan postou acima?
Posta o código novamente.
C
CavalierWorks
Aqui contatodao
packagebr.com.caelum.jdbc.dao;importjava.sql.Connection;importjava.sql.Date;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.ArrayList;importjava.util.Calendar;importjava.util.List;importbr.caelum.jdbc.ConnectionFactory;importbr.caelum.jdbc.modelo.Contato;publicclassContatoDAO{privateConnectionconnection;publicContatoDAO(){this.connection=newConnectionFactory().getConnection();}publicvoidadiciona(Contatocontato){Stringsql="insert into contatos"+"(nome, email, endereco, dataNas)"+"values(?,?,?,?)";try{// Prepared Statement para inserçãoPreparedStatementstmt=connection.prepareStatement(sql);// Seta os valoresstmt.setString(1,contato.getNome());stmt.setString(2,contato.getEmail());stmt.setString(3,contato.getEndereco());stmt.setDate(4,newDate(contato.getDataNas().getTimeInMillis()));// Executa e fechastmt.execute();stmt.close();}catch(SQLExceptione){System.out.println("Erro"+e);}catch(NullPointerExceptionen){System.out.println("Erro NullPointer"+en);}}publicList<Contato>getLista(){try{List<Contato>contatos=newArrayList<Contato>();PreparedStatementstmt=this.connection.prepareStatement("select * from contatos");ResultSetrs=stmt.executeQuery();while(rs.next()){// Criando o objeto contatoContatocontato=newContato();contato.setId(rs.getLong("id"));contato.setNome(rs.getString("nome"));contato.setEmail(rs.getString("email"));contato.setEndereco(rs.getString("endereco"));// montando a tela atraves do calendarCalendardata=Calendar.getInstance();data.setTime(rs.getDate("dataNas"));contato.setDataNas(data);// adicionando objetos a listacontatos.add(contato);}rs.close();stmt.close();returncontatos;}catch(SQLExceptione){thrownewRuntimeException(e);}}
}
Aqui o AdicionaServlet
packagebr.com.caelum.servlet;importjava.io.IOException;importjava.io.PrintWriter;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Calendar;importjava.util.Date;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importbr.caelum.jdbc.modelo.Contato;importbr.com.caelum.jdbc.dao.ContatoDAO;@WebServlet("/adicionaContato")publicclassAdicionaContatoServletextendsHttpServlet{/** * */privatestaticfinallongserialVersionUID=1L;@Overrideprotectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();// pegando os parâmetros do RequestStringnome=request.getParameter("nome");Stringendereco=request.getParameter("endereco");Stringemail=request.getParameter("email");StringdataTexto=request.getParameter("dataNas");CalendardataNas=null;// fazendo a conversão da datatry{Datedate=newSimpleDateFormat("dd/MM/yyyy").parse(dataTexto);dataNas=Calendar.getInstance();dataNas.setTime(date);}catch(ParseExceptione){out.println("Erro de conversão da data");return;// para a execução do método}catch(NullPointerExceptionen){out.println("Null"+en);}// monta um objeto contatoContatocontato=newContato();contato.setNome(nome);contato.setEndereco(endereco);contato.setEmail(email);contato.setDataNas(dataNas);// salva o contatoContatoDAOdao=newContatoDAO();dao.adiciona(contato);// imprime o nome do contato que foi adicionadoout.println("<html>");out.println("<body>");out.println("<Contato>"+contato.getNome()+"adicionado com sucesso");out.println("</body>");out.println("</html>");}