Erro com java + postgreSQL

22 respostas
java
Y

Meu codigo esta dando o seguinte erro

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at controle.ControleFornecedor.Primeiro(ControleFornecedor.java:63)
	at visao.FrmFornecedor.jButtonPrimeiroActionPerformed(FrmFornecedor.java:393)
	at visao.FrmFornecedor.access$600(FrmFornecedor.java:20)
	at visao.FrmFornecedor$5.actionPerformed(FrmFornecedor.java:143)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6533)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6298)
	at java.awt.Container.processEvent(Container.java:2236)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2294)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
	at java.awt.Container.dispatchEventImpl(Container.java:2280)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

22 Respostas

Y
public ModeloFornecedor Ultimo (){
        conn.conexao();
        try {
            conn.executaSQL("select * from fornecedores inner join bairro on fornecedores.id_bairro=bairro.id_bairro "
            +"inner join cidade on bairro.id_cidade = cidade.id_cidade"
            +"inner join estados on cidade.id_estado=estados.id_estado"); 
            conn.rs.last();
            mod.setId(conn.rs.getInt("id_fornecedores"));
            mod.setNome(conn.rs.getString("nome_fornecedor"));
            mod.setEndereco(conn.rs.getString("endereco"));
            mod.setBairro(conn.rs.getString("nome_bairro"));
            mod.setCNPJ(conn.rs.getString("cnpj_fornecedor"));
            mod.setNome_bairro(conn.rs.getString("nomes_cidades"));
            mod.setSigla_estado(conn.rs.getString("sigla_estado"));
            
                    
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar o primeiro!\nERRO:"+ex);
        }
        conn.desconecta();
        return mod;
P

Que está na linha 63 desta classe ControleFornecedor?

Y
63             conn.rs.first();
 64           mod.setId(conn.rs.getInt("id_fornecedor"));
 65           mod.setNome(conn.rs.getString("nome_fornecedor"));
 66         mod.setEndereco(conn.rs.getString("endereco"));
 67         mod.setBairro(conn.rs.getString("nome_bairro"));
            mod.setCNPJ(conn.rs.getString("cnpj_fornecedor"));
            mod.setNomeCidade(conn.rs.getString("nomes_cidades"));
            mod.setSigla_estado(conn.rs.getString("sigla_estado"));
R

sua conexao ta vazia/nao foi atribuido nada a essa variavel conn.

E por favor, toda vez que for postar códigos aqui ou erros, faz a formatação.

image

Y

conn e a variável de conexão para conectar o banco, o certo seria quando eu chamasse o metedo “ultimo” pegasse o ultimo dado do banco.

ainda sou bastante leigo em java e postgresql.

R

faz assim e fala oq vai acontecer:

if(!conn.first){
   System.out.println("Não há dados");
} else {
    //pega os dados do banco.
}
Y

apareceu a mensagem “Não há dados”

R

então não tem dado na tabela… vc ta tentando recuperar dados inexistentes

Y

mas tem dados na tabela sim, aqui esta ela.

R

Faz o teste la no banco, tenta rodar essa query la:

select * from fornecedores inner join bairro on fornecedores.id_bairro=bairro.id_bairro inner join cidade on bairro.id_cidade = cidade.id_cidade inner join estados on cidade.id_estado=estados.id_estado

Provavelmente nao ta retornando dado nenhum

Y

retornou a tabela normalmente.

R

Tá.

Isso aqui não é do mesmo trecho de codigo que vc enviou, manda o correto então

Y

pertece sim. segue ele abaixo novamente. acabei de rodar aki e deu o mesmo erro.

conn.conexao();
try {

conn.executaSQL("select * from fornecedores inner join bairro on fornecedores.id_bairro=bairro.id_bairro "
        +"inner join cidade on bairro.id_cidade = cidade.id_cidade"
        +"inner join estados on cidade.id_estado=estados.id_estado"); 
   
        
              
        
        
        
        conn.rs.first();
        mod.setId(conn.rs.getInt("id_fornecedor"));
        mod.setNome(conn.rs.getString("nome_fornecedor"));
        mod.setEndereco(conn.rs.getString("endereco"));
        mod.setBairro(conn.rs.getString("nome_bairro"));
        mod.setCNPJ(conn.rs.getString("cnpj_fornecedor"));
        mod.setNomeCidade(conn.rs.getString("nomes_cidades"));
        mod.setSigla_estado(conn.rs.getString("sigla_estado"));
        
                
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao buscar o primeiro!\nERRO:"+ex);
    }
    conn.desconecta();
    return mod;
}
R

é que no codigo q vc tinha enviado estava como conn.rs.last(); e no erro estava conn.rs.first();


Se no if(!conn.rs.first()){} retornou true, a indicação é que não há dados… Mesmo erro de nullPointer?

Y

então e por que são dois botoes para setar o ultimo e o primeiro dado então são os mesmo códigos só muda o last e first mesmo.

sim mesmo erro do nullpointer
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at controle.ControleFornecedor.Primeiro(ControleFornecedor.java:83)

P

O NullPointerException não tem nada a ver com o chamar do first ou o ter ou não ter dados na tabela.

Mostra a tua classe de Conexao (a da variavel conn). Aposto que conn.rs está a null

R

Não que nao tenha nada a ver, conn.rs estar null é uma possibilidade. Mas se ele não tivesse dados na tabela, retornaria o mesmo nullPointer do mesmo jeito

P

Retornaria um outro erro mas não um NullPointerException. Provavelmente seria uma SQLException

R

Vixi, nem lembro o retorno, mas faz sentido, é mais logico retornar o sqlEx mesmo

Y

Creio que não seja a classe de conexão com o banco, por que o outros formulários funciona normalmente so esse que esta com erro.

public Statement stm;//responsável por preparar e realizar pesquisa no banco de dados//
public ResultSet rs; //responsável por armazenar o resultado de uma pesquisa passada para o STM//
private String driver = "org.postgresql.Driver"; //responsável por indetificar o serviço do banco de dados//
private String caminho = "jdbc:postgresql://localhost:5432/sistema";//responsável por setar o local do banco //
private String usuario = "postgres";
private String senha = "10074546";
public Connection conn; //responsável pela conexao com banco de dados//


public void conexao(){//metodo responsavel por realizar a conexao com o banco//
    
    System.setProperty("jdbc.Drivers", driver);
    try {
        conn=DriverManager.getConnection(caminho, usuario, senha);
        //JOptionPane.showMessageDialog(null,"conectado com sucesso!");//
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null,"erro de conexão!\n Erro:"+ex.getMessage());
        Logger.getLogger(ConectaBanco.class.getName()).log(Level.SEVERE, null, ex);
    }
}


    try {
            stm = conn.createStatement(rs.TYPE_SCROLL_INSENSITIVE,rs.CONCUR_READ_ONLY);
            rs = stm.executeQuery(sql);
            
        
    } catch (SQLException ex) {
           // JOptionPane.showMessageDialog(null,"Erro ao excluir! \n Erro>"+ex.getMessage());
        }        
}
public void desconecta(){//metodo para fechar a conexao com o banco de dados//
    
    try {
        conn.close();
        //JOptionPane.showMessageDialog(null,"desconetado com sucesso!");
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null,"erro ao fechar  conexão!\n Erro:"+ex.getMessage());
        
        
    }
    
}

}

Y

e a primeira vez que estou estudando banco de dados aew estou bastante perdido.

P

Estás a esconder o erro se algo correr mal a criar o ResultSet, ficando a null sem tu te aperceberes.
Ao ver isto percebi que a query deve estar errada e…

Falta ali um espaço. Está a ser interpretado como .id_cidadeinner

Nunca deixes catch com o corpo vazio. Estás a esconder erros.

Criado 2 de outubro de 2020
Ultima resposta 24 de dez. de 2020
Respostas 22
Participantes 3