NullPointerException em Cadastro Postgresql

26 respostas Resolvido
nulldatabasepostgresqlconectionjava
Z

Boa tarde pessoal

Estou tentando fazer um cadastro usando java no postgresql. Porém está dando a seguinte msg:

Caused by: java.lang.NullPointerException

o que acontece é que a linha que dá esse erro é essa:

cst = conect.con.prepareCall("INSERT INTO dbsinan.tb_notificacao(nu_notificacao,dt_notificacao) values(?,?);

Já fiz debug e os dados nu_notificação e dt_notificação está chegando corretamente dessa forma:

cst.setString(1, f.getNu_notificacao());
cst.setDate(2, new java.sql.Date(f.getDt_notificacao().getTime()));

Segue abaixo a conexão com DB:

try {
            Class.forName("org.postgresql.Driver");
            conPostgres = DriverManager.getConnection("jdbc:postgresql://10.8.0.105:5445/sinanpop51", "postgres", "");
//            con = DriverManager.getConnection("jdbc:postgresql://192.168.1.19:5445/sinanpop51", "postgres", "");
            System.out.println("SINOMP - Postgresql ConnectON: " + conPostgres);
        } . . .

26 Respostas

J

faça um debug do seu código e veja se os valores que você está tentando salvar realmente estão nas variáveis.
java.lang.NullPointerException

este erro acontece quando não tem conteúdo nas variáveis ou o retorno de alguma função é nulo quando deveria retornar algo

Z

Pois já fiz. E todos estão chegando corretamente.

Me parece ser algo no SQL. Muito estranho, não mexi e semana passada estava cadastrando.

J

já verificou se sua aplicação realmente está conectada ao banco de dados?

B

não seria

cst = conect.con.prepareStatement("INSERT INTO dbsinan.tb_notificacao(nu_notificacao,dt_notificacao) values(?,?)");

prepareCall é para executar Stored Procedure (SP)

J

Faz sentido. tente conect.con.preparedStatement("…");

Z

Segue a resposta na hora da conexão: org.postgresql.jdbc4.Jdbc4Connection@44e91c07

Z

Vou testar usando java.sql.PreparedStatement

B

né mesmo… e concordo com vc verifique qual o retorno do seu DriverManager ele pode dar dando nullpointer e vc num estar percebendo

Z

Certo. Vou testar e posto aqui o resultado

obrigado pela ajuda de vcs

Z

Bahhh… Mesma coisa.

Segue a msg de erro:

Postgresql ConnectON: org.postgresql.jdbc4.Jdbc4Connection@34ec2c16
Postgresql ConnectON: org.postgresql.jdbc4.Jdbc4Connection@231acef3
Erro postgresql: java.lang.NullPointerException
Exception in thread "Thread-8" java.lang.NullPointerException
	at sinomp.cadastros.PgTbNotificacao.run(PgTbNotificacao.java:35)
ConnectON: com.mysql.jdbc.JDBC4Connection@34659228
ConnectON: com.mysql.jdbc.JDBC4Connection@339c6c67
ConnectOFF: com.mysql.jdbc.JDBC4Connection@339c6c67
	at java.lang.Thread.run(Thread.java:748)

pergunto:

Será que tem a ver com a classe de cadastro estar dentro de uma Thread?

Estou chamando assim:

public boolean threadAdd(ClassNotificacao f) {
        
        new Thread(new PgTbNotificacao(f)).start();

        new Thread(new PgTbViolDom(f)).start();

        return true;
    }

E aqui a classe Implements Runnable

public class PgTbNotificacao implements Serializable, Runnable {

    private PreparedStatement cst;
    private final ConexaoDB conect = new ConexaoDB();
    private final SinanNotificacao f;

    public PgTbNotificacao(SinanNotificacao f) {
        this.f = f;
    }

    @Override
    public void run() {
        try {
            conect.openPostgreSql();
            cst = conect.con.prepareStatement("INSERT INTO dbsinan.tb_notificacao("
                    + "nu_notificacao,"
                    + "dt_notificacao) "
                    + "VALUES(?,?)");
            cst.setString(1, f.getNu_notificacao());
            cst.setDate(2, new java.sql.Date(f.getDt_notificacao().getTime()));

            cst.execute();
            cst.close();
            conect.closePostgreSql();
        } catch (SQLException e) {
            System.err.println("erro postgres: " + e);
        }
    }
}
J

interessante é que a mensagem que você adicionou no catch não está aparecendo. “erro postgres:” deveria aparecer caso ocorresse algum erro na inserção

Z

Pois é. No DEBUG ele para exatamente na linha: cst = conect.con.prepareStatement("INSERT INT....

Z

To achando que é erro de conexão com DB.

J

ao envés de fazer uma inserção, tente fazer uma consulta e faz o debug pra ver se é retornado alguma coisa. se não der erro, iremos saber que o erro está na inserção. se der erro, verifica tua conexão e o jar do banco de dados pq provavelmente ele não estará conectando

Z

Boa… Vou testar

valeu

Z

Mesmo erro com um SELECT.

Então é erro de conexão mesmo. O DB não está abrindo.

Valeu pessoal vou trabalhar agora pra descobrir qual o problema…

posto aqui daqui a pouco.

Valeu

G

Você está instanciando a classe de conexão e chamando o método de conectar logo em seguida, certo?

Aqui não seria conect.con().prepareStatement ?

Z

To usando essa versão de PostgreSQL: 9.0 (x86)

e no Maven:

<dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.1-901.jdbc4</version>
    </dependency>
B

tenho certeza q é conexão…posta sua classe de conexão…

Z

Crio uma instancia:
private final ConexaoDB conect = new ConexaoDB();

depois uso ela e chamo o método:
conect.openPostgreSql();

no mysql ta funcionando bem assim.

Acredito que possa tá com algum problema com o driver do Postgresql

B

retorna o que?? vc tem q retornar um Connection e com esse Connection vc fazer o prepareStatement e todo resto

Z
public class ConexaoDB implements Serializable {

    public Connection conPostgres;

    public Connection openPostgreSql() {
        try {
            Class.forName("org.postgresql.Driver");
            conPostgres = DriverManager.getConnection("jdbc:postgresql://10.8.0.105:5445/sinanpop51", "postgres", "");
            System.out.println("Postgresql ConnectON: " + conPostgres);
        } catch (ClassNotFoundException ex) {
            System.out.println("ClassNotFoundException: " + ex);
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex);
        } catch (NullPointerException err) {
            System.out.println("NullPointerException: " + err);
        }
        return conPostgres;
    }

    public void closePostgreSql() {
        try {
            System.out.println("SINOMP - Postgresql ConnectOFF: " + conPostgres);
            conPostgres.close();
        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex);
        }
    }
Z

Esse ta retornando: org.postgresql.jdbc4.Jdbc4Connection@16ea171f

B
Solucao aceita
public class ConexaoDB implements Serializable {

    static {
        try {
            Class.forName("org.postgresql.Driver");

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

    public static Connection openPostgreSql() throws Exception {

        return DriverManager.getConnection("jdbc:postgresql://10.8.0.105:5445/sinanpop51", "postgres", "");

    }

    public void closePostgreSql(Connection conPostgres) throws Exception{
        if (conPostgres != null) {
            conPostgres.close();
        }
    }
}

sem dor…hehe

Z

Vou testar :smiley:

Z

Deu certo pessoal:

private static final ConexaoPostgres conect = new ConexaoPostgres();

Connection x = conect.openPostgreSql();
cst = x.prepareCall("INSERT INTO dbsinan.tb_notificacao......);

Agradeço pela ajuda.

Valeu esmo.

Criado 30 de agosto de 2017
Ultima resposta 30 de ago. de 2017
Respostas 26
Participantes 4