Javalangnullpointerexception - Não consigo resolver

7 respostas
leoarborges

Boa tarde, sou iniciante em desenvolvimento web com java e me deparei com um problema que não sei a solução, andei procurando na internet e mesmo assim não consegui resolver, a situação é a seguinte tem um arquivo chamado novoContato.jsp que possui um formulário básico de cadastro com dois campos nome e celular, na
hora que clico em gravar ele aciona esse servlet abaixo, não dá nenhum erro pois a classe DAO e as conexões estão perfeita, mas não grava nada no banco de dados mysql que estou usando, a unica mensagem que dá é javalangnullpointerexception que vi na saída do Apache Tomcat que é o servidor que uso.

Andei pesquisando pelo para saber um pouco mais sobre a mensagem e descobri que é quando alguma variavel é nula, mais não sei resolver o problema que está nas variaveis que estou recebendo do formulário nome e celular, no netbeans ele diz assim : "A variavel nome não é usada" dai acho que a causa de não estar efetuando o cadastro no banco é essa...

Ajudem ai galera,
Atte, Leonardo Borges...

package action;

import dao.FabricaConexao;
import dao.JDBCContatoDAO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import javax.s ervlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.Contato;

public class InserirContato extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet InserirContato</title>");  
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet InserirContato at " + request.getContextPath () + "</h1>");
            out.println("</body>");
            out.println("</html>");
             */
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    //Handles the HTTP <code>POST</code> method.
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
       
        String nome = request.getParameter("nome"); // diz que a variavel nome não é usada
         String celular = request.getParameter("celular"); // diz que a variavel celular não é usada


        Contato novoContato = new Contato(); // Instancia um objeto novoContato da classe Contato.java

         novoContato.setNome(nome);
         novoContato.setCelular(celular);
       
        // usando minha fabrica de conexão
        FabricaConexao fabrica = new FabricaConexao();
        Connection conexao = fabrica.FazConexao();
        JDBCContatoDAO dao = new JDBCContatoDAO(conexao);

        dao.Inserir(novoContato);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

7 Respostas

drsmachado

Posta o stackTrace ou o trecho do log do apache em que o erro é indicado

leoarborges

drsmachado nem sei explicar agora, mas limpei o log do servidor apache e executei denovo e desapareceu o erro, acredito que foi quando meu professor mandou deixar uma classe publica agora a pouco pelo messenger, agora o servidor não está mostrando nenhum log de erro, tá funcionando perfeitamente…

Essa classe abaixo é a que faz a gravação no banco…

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.Contato;

public class JDBCContatoDAO implements ContatoDAO {

    Connection conexao;

    public JDBCContatoDAO(Connection conexao) {
        this.conexao = conexao;
    }

    @Override
    public void Inserir(Contato contato) {
        String comando = "insert into contato (nome,celular)"+" values (?,?);";
       // String comando = "insert into contato (codigo,nome,celular)" + "values (?,?,?)";
//String seleciona = "selec * from contato";
        PreparedStatement p;

        try {
            p = this.conexao.prepareStatement(comando);
        //    p.setInt(1, contato.getCodigo());
            p.setString(1, contato.getNome());
            p.setString(2, contato.getCelular());

        } catch (SQLException ex) {
            Logger.getLogger(JDBCContatoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public List<Contato> ListarTodos() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
ViniGodoy

Se você tinha um erro, é uma péssima idéia limpar os logs sem entender perfeitamente porque ocorreu. Não é porque agora você não é capaz de simulá-lo que ele não está lá. Os programas tem a mania chata de não se corrigir sozinhos. Na verdade, esperar que isso ocorra é uma POG.

O maior problema é que isso pode só se reproduzir novamente na frente do seu cliente (ou, se for um trabalho de faculdade, seu professor).

leoarborges

Consegui simular o erro novamente, nunca mais apago o log do servidor :smiley:

06/10/2011 20:13:30 org.apache.catalina.core.StandardContext reload INFO: Reloading Context with name [/Agenda] has started 06/10/2011 20:13:33 org.apache.catalina.core.StandardContext reload INFO: Reloading Context with name [/Agenda] is completed 06/10/2011 20:13:34 org.apache.catalina.loader.WebappClassLoader loadClass INFO: Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.SQLError. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. java.lang.IllegalStateException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1562) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3348) at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1692) at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4388) at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1368) at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2737) at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83) at java.lang.ref.Finalizer.access$100(Finalizer.java:14) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 06/10/2011 20:13:34 org.apache.catalina.loader.WebappClassLoader loadClass INFO: Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.ProfilerEventHandlerFactory. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. java.lang.IllegalStateException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1562) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4412) at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1368) at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2737) at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83) at java.lang.ref.Finalizer.access$100(Finalizer.java:14) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 06/10/2011 20:13:34 org.apache.catalina.loader.WebappClassLoader loadClass INFO: Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.SQLError. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. java.lang.IllegalStateException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1562) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3348) at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1692) at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4388) at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1368) at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2737) at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83) at java.lang.ref.Finalizer.access$100(Finalizer.java:14) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160) 06/10/2011 20:13:34 org.apache.catalina.loader.WebappClassLoader loadClass INFO: Illegal access: this web application instance has been stopped already. Could not load com.mysql.jdbc.ProfilerEventHandlerFactory. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. java.lang.IllegalStateException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1562) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521) at com.mysql.jdbc.ConnectionImpl.realClose(ConnectionImpl.java:4412) at com.mysql.jdbc.ConnectionImpl.cleanup(ConnectionImpl.java:1368) at com.mysql.jdbc.ConnectionImpl.finalize(ConnectionImpl.java:2737) at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83) at java.lang.ref.Finalizer.access$100(Finalizer.java:14) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)

ViniGodoy

Menos mal, pelo menos o próprio erro já diz que foi disparado só para fins de debug e não tem impacto funcional. :slight_smile:

leoarborges

Quer dizer que não tem nenhum erro ?

ViniGodoy

Quer dizer que não tem nenhum erro ?

O log está explicando que não pode criar o SQLError pois a aplicação já havia sido finalizada pelo servidor. Com a aplicação finalizada, isso gera um problema de estado inválido e a ferramenta de log anota esse fato.

Logs do tipo INFO geralmente são apenas warnings, não erros de verdade. É bom pelo menos dar uma lida neles e até pesquisar se tem alguma forma de evita-los, mas nem sempre é realmente necessário resolve-los.

Criado 6 de outubro de 2011
Ultima resposta 6 de out. de 2011
Respostas 7
Participantes 3