NullPointerException em OO

5 respostas
EDIMIL

Pessoal boa noite,
sei que estou com um problema simples mas não consigo resolver, é o seguinte:

tenho 3 pacotes, no pacote utilitários tenha uma classe conexão, no pacote controle tenho a classe cadastro para inserir no banco e no pacote view tenha tenho a classe cargo que é o formulario, quando utilizo somente a classe cargo com a classe conexão consigo inserir no banco normalmente, mas quando eu modifico esta classe cargo enviando um parâmetro para a classe cadastro dá erro de NullPointer... na hora que vai executar "objConexao.statement.executeUpdate(sql);", segue os códigos abaixo:

alguém pode ajudar?

classe Conexao:

package utilitarios;

import java.sql.*;
import javax.swing.*;

public class conexao {
   
    private Connection conexao;
    public Statement statement;
    public ResultSet resultset;

    public boolean conecta() {
        boolean result = true;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conexao = DriverManager.getConnection("jdbc:mysql://localhost/controle estoque", "root", "root");
        } catch (ClassNotFoundException Driver) {
            JOptionPane.showMessageDialog(null, "Driver não encontrado: " + Driver);
            result = false;
        } catch (SQLException Fonte) {
            JOptionPane.showMessageDialog(null, "Ocorreu um erro na conexão: " + Fonte);
            result = false;
        }
        return result;
    }

    public void desconecta() {
        boolean result = true;
        try {
            conexao.close();
        } catch (SQLException fechaBanco) {
            JOptionPane.showMessageDialog(null, "Conexão ainda aberta: " + fechaBanco);
            result = false;
        }
    }

    public void executeSQL(String sql) {
        try {
            statement = conexao.createStatement(
                    resultset.TYPE_SCROLL_SENSITIVE,resultset.CONCUR_READ_ONLY);//o parâmetro indica que o statement é navegável
            resultset = statement.executeQuery(sql);                  
            
        }catch(SQLException erroSQL){
            JOptionPane.showMessageDialog(null, "Erro ao executar SQL: "+ sql+" - " + erroSQL );
        }
    }    
}

classe Cadastro:

package controle;

import java.sql.SQLException;
import javax.swing.JOptionPane;
import utilitarios.conexao;

/**
 *
 *
 */
public class Cadastro {

    conexao objConexao;

    public Cadastro() {
        objConexao = new conexao();
        objConexao.conecta();
    }

    public void gravarDados(String sql) {       
        try {
            //dá o erro aqui
            objConexao.statement.executeUpdate(sql);
              } catch (SQLException erro) {
            JOptionPane.showMessageDialog(null, "Erro ao gravar dados " + erro);
        }
    }
}

método da classe Cargo sem alteração:

public void gravarCargo() {
       //Cadastro cd = new Cadastro();
       String sqlInsert = "insert into cargo (dep_cod,cargo_nome) values (" + getCodDepart() + ",'" + jtCargo.getText() + "')";       
       //cd.gravarDados(sqlInsert);
       try {
            objConexao.statement.executeUpdate(sqlInsert);
        } catch (SQLException erro) {
            JOptionPane.showMessageDialog(null, "Erro ao gravar dados " + erro);
        }
       jtCargo.setText("");
       jtCargo.requestFocus();
       preencheTable(sqlTable);
    }

método da classe Cargo alterado: (dá erro de NullPointer...)

public void gravarCargo() {
       Cadastro cd = new Cadastro();
       String sqlInsert = "insert into cargo (dep_cod,cargo_nome) values (" + getCodDepart() + ",'" + jtCargo.getText() + "')";       
       cd.gravarDados(sqlInsert);
       //try {
            //objConexao.statement.executeUpdate(sqlInsert);
        //} catch (SQLException erro) {
            //JOptionPane.showMessageDialog(null, "Erro ao gravar dados " + erro);
        //}
       jtCargo.setText("");
       jtCargo.requestFocus();
       preencheTable(sqlTable);
    }

5 Respostas

Trebloc

Provavelmente você não inicializou o statement antes de utilizar aquele método na classe Cadastro. Assim, o statement permanece nulo e qualquer método que você tentar usar dele resulta em NullPointerException.

Pelo que eu notei, seu statement só recebe algum objeto no método executeSQL:

statement = conexao.createStatement( resultset.TYPE_SCROLL_SENSITIVE,resultset.CONCUR_READ_ONLY);//o parâmetro indica que o statement é navegável

EDIMIL

Trebloc:
Provavelmente você não inicializou o statement antes de utilizar aquele método na classe Cadastro. Assim, o statement permanece nulo e qualquer método que você tentar usar dele resulta em NullPointerException.

Pelo que eu notei, seu statement só recebe algum objeto no método executeSQL:

statement = conexao.createStatement( resultset.TYPE_SCROLL_SENSITIVE,resultset.CONCUR_READ_ONLY);//o parâmetro indica que o statement é navegável

Mas Trebloc eu usei o mesmo statement na classe Cargo e não deu erro, como devo iniciar ele?

walacy

Veja não está criando um novo “Statement” na classe conexão.

objConexao.createStatement(/*Parametros*/).executeUpdate("query");//faça assim...

Ou então use o método que você criou na classe de conexão, né?! executeSQL(String sql)

Abraço!

lina

Oi,

Em nenhum momento você cria a variavel statement.

Logo, quando você for fazer:

objConexao.statement.executeUpdate(sqlInsert);

Na realidade você está fazendo:

objConexao.null.executeUpdate(sqlInsert);

Ou seja:

NullPointerException.

Percebi que o método executeSQL(String sql) da classe Conexao é responsável por criar instanciar a variavel statement. No qual não está sendo chamado.

Tchauzin!

EDIMIL
walacy:
Veja não está criando um novo "Statement" na classe conexão.
objConexao.createStatement(/*Parametros*/).executeUpdate("query");//faça assim...

Ou então use o método que você criou na classe de conexão, né?! executeSQL(String sql)

Abraço!

Valeu! Valeu! Valeu!

Obrigado a todos que me ajudaram, Trebloc, walacy, lina, analisando todas as opções que me deram consegui resolver criando um novo método na classe conexão, um específico para executar o "Update", não sei se dará algum problema no futuro, mas está funcionando;
segue aí o código, e obrigado mesmo...

public void executeUpdate(String query){
        try {
            conexao.createStatement().executeUpdate(query);
            statement = conexao.createStatement(
                    resultset.TYPE_SCROLL_SENSITIVE, resultset.CONCUR_READ_ONLY);//o parâmetro indica que o statement é navegável

        }catch(SQLException erroSQL){
            JOptionPane.showMessageDialog(null, "Erro ao executar SQL: "+ query+" - " + erroSQL );
        }
    }
Criado 23 de março de 2010
Ultima resposta 24 de mar. de 2010
Respostas 5
Participantes 4