Erro de Conexão com MySQL NullPointerException

Bom dia, estou com um erro no PreparedStatement pelo que andei pesquisando o problema seria minha conexão, só que eu não sei onde está errado o programa não dispara erro algum.
public void preencherTabela(String SQL){

    connection con = new connection();
    ArrayList dados = new ArrayList();

    String[]Colunas = new String[]{"id","nome","marca","quantidade","peso","compra","venda"};
    
    con.executaSQL(SQL);
    
    try {
        
        do{
            dados.add(new Object[]{con.rs.getString("id"),con.rs.getString("nome"),con.rs.getString("marca"),
            con.rs.getString("quantidade"),con.rs.getString("peso"),con.rs.getString("compra"),con.rs.getString("venda")});
        }while(con.rs.next());
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao preencher o ArrayList!\n"+ ex.getMessage());
    }
    modelTable modelo = new modelTable(dados, Colunas);
    tabelaProduto.setModel(modelo);
    tabelaProduto.getColumnModel().getColumn(0).setPreferredWidth(80);
    tabelaProduto.getColumnModel().getColumn(0).setResizable(true);
    tabelaProduto.getColumnModel().getColumn(1).setPreferredWidth(160);
    tabelaProduto.getColumnModel().getColumn(1).setResizable(true);
    tabelaProduto.getColumnModel().getColumn(2).setPreferredWidth(160);
    tabelaProduto.getColumnModel().getColumn(2).setResizable(true);
    tabelaProduto.getColumnModel().getColumn(3).setPreferredWidth(80);
    tabelaProduto.getColumnModel().getColumn(3).setResizable(true);
    tabelaProduto.getColumnModel().getColumn(4).setPreferredWidth(80);
    tabelaProduto.getColumnModel().getColumn(4).setResizable(true);
    tabelaProduto.getColumnModel().getColumn(5).setPreferredWidth(80);
    tabelaProduto.getColumnModel().getColumn(5).setResizable(true);
    tabelaProduto.getColumnModel().getColumn(6).setPreferredWidth(80);
    tabelaProduto.getColumnModel().getColumn(6).setResizable(true);
    tabelaProduto.getTableHeader().setReorderingAllowed(false);
    tabelaProduto.setAutoResizeMode(tabelaProduto.AUTO_RESIZE_OFF);
    tabelaProduto.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}

Está é a função da tabela que quero chamar onde chamo o executaSQL.

public class connection {

private static Connection con;
public PreparedStatement pst;
public ResultSet rs;

public static Connection conexao() throws SQLException{
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/estoque?useSSL=false", "root", "");
    } catch (ClassNotFoundException ex) {
        //JOptionPane.showMessageDialog(null, "Estado da conexão: "+con==null);
    }
    return con;
}

public void executaSQL(String sql){
    try {
          
        pst = (PreparedStatement) con.createStatement(rs.TYPE_SCROLL_INSENSITIVE, rs.CONCUR_READ_ONLY); 
        rs = pst.executeQuery(sql); 
    } catch (SQLException ex) {
        //JOptionPane.showMessageDialog(null,"Erro ao executarSQL!"+ex);
    }
}
public void desconecta(){
    
    try {
        con.close();
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Desconexão com banco de dados efetuada com sucesso!");
    }
}

}

Esse é a conexão a linha de erro de nullpointer é a linha:
"pst = (PreparedStatement) con.createStatement(rs.TYPE_SCROLL_INSENSITIVE, rs.CONCUR_READ_ONLY); "

Alguém tem ideia de como faço para resolver isso? Agradeço desde já.

Poste a mensagem de erro.

A mensagem de erro é esta:
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at modelConection.connection.executaSQL(connection.java:31)
at telas.cadastroProduto.preencherTabela(cadastroProduto.java:384)
at telas.cadastroProduto.(cadastroProduto.java:28)
at telas.cadastroProduto.lambda$main$0(cadastroProduto.java:438)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
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:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
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)
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

Basicamente, con está nulo.
Reveja o trecho de código onde instancia esse objeto.

Ah, por que do uso de cast explícito na atribuição do PreparedStatement?

Darlan, você poderia me ajudar nisso? É que eu sou novo com java e MySQL tem pouco menos de 1 mês que estou aprendendo. Então você poderia me dizer como faço para resolver esse problema do con? E cast explicito, eu estava acompanhando umas video aulas para fazer o método da tabela, e lá ele usa o cast assim, e pra ele dá certo.

Onde você instancia o objeto con?

Outra cosia, jamais faça isso

Ao menos deixe printar o stack do erro

ex.printStackTrace();
1 curtida

Se instanciar for chamar o método, eu o chamei aqui:
connection con = new connection();

Agora por que o menssage dialog é errado? Com ele aparece uma mensagem em tela para usuário, fazendo assim com que ele saiba onde está o erro.

Cara, tem algo de muito errado na tua classe.
Primeiro que nunca vi você precisar de cast

Posta a classe inteira, só para ver como estão as declarações.

Por estar comentado, fera

1 curtida

A classe da connection inteira:

package modelConection;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class connection {

private static Connection con;
public PreparedStatement pst;
public ResultSet rs;

public static Connection conexao() throws SQLException{
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/estoque?useSSL=false", "root", "");
    } catch (ClassNotFoundException ex) {
        //JOptionPane.showMessageDialog(null, "Estado da conexão: "+con==null);
    }
    return con;
    
}

public void executaSQL(String sql){
    try {
          
        pst = (PreparedStatement) con.createStatement(rs.TYPE_SCROLL_INSENSITIVE, rs.CONCUR_READ_ONLY); 
        rs = pst.executeQuery(sql); 
    } catch (SQLException ex) {
        //JOptionPane.showMessageDialog(null,"Erro ao executarSQL!"+ex);
    }
    
}
public void desconecta(){
    
    try {
        con.close();
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Desconexão com banco de dados efetuada com sucesso!");
    }
}

}

E eu comentei aquela linha porque não queria que aparecesse agora no código.

Comece trocando estes imports por

import java.sql.Connection;
import java.sql.PreparedStatement;

Depois, tire o comentário desta linha, dentro do método execute:

Talvez isso não resolva, mas aí você terá o erro que está ocorrendo.

1 curtida

Pois é o erro continua o mesmo, não apareceu nenhum erro novo, a unica coisa que aparece é que

pst = (PreparedStatement) con.createStatement(rs.TYPE_SCROLL_INSENSITIVE, rs.CONCUR_READ_ONLY);

Aparentemente o erro que tenho é dentro do ExecutaSQL, mas não entendo, pelo vídeo que estava
acompanhando para importar os dados do sql para a tabela no netbeans, o método está idêntico, mas para o programa eu tenho esse erro.
Na linha de erro 384 dá um erro depois da execução justamente quando chamo o modelo
con.executaSQL

Qual a mensagem de erro?
Por isso eu havia sugerido o printStackTrace, ficaria mais fácil de colocar aqui…

Bom usei o ex.printStackTrace(); mas ele não a nenhuma mensagem nova, a mensagem de erro que mostra é essa:
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at modelConection.connection.executaSQL(connection.java:32)
at telas.cadastroProduto.preencherTabela(cadastroProduto.java:384)
at telas.cadastroProduto.(cadastroProduto.java:28)
at telas.cadastroProduto.lambda$main$0(cadastroProduto.java:440)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
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:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
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)
CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)
Pelo que vi aqui no fórum o erro é o meu connection, nos exemplos que vi o erro era que não tinha sido informado o return e por isso esta como null, para sanar o erro teria que colar return con; já tentei este metodo mas o erro mesmo assim persiste. E como meu executaSQL é void dá até um erro se eu colocar o return nele.

Qual seria a linha 32 da classe connection (por que a classe está escrita com a primeira letra minúscula?)?

Tinha usado uma classe que se colocasse com “C” maiúsculo dava um erro então coloquei como minusculo e o erro desapareceu, também me foi passado na faculdade que iniciasse variáveis com letras minusculas, e por costume declarei minhas classes também com letras minusculas. Bom mudei aqui o que era connection para ConexaoBD segui o que falou, mas o erro ainda continua exatamente na mesma linda. A linhas 32 é está:

at modelConection.ConexaoBD.executaSQL(ConexaoBD.java:32)
pst = (PreparedStatement) con.createStatement(rs.TYPE_SCROLL_INSENSITIVE, rs.CONCUR_READ_ONLY);

Classes, sempre, terão nome iniciado em maiúsculo.
Objetos e métodos, sim, com letra minúscula.

Tá, das duas uma:
E, agora que eu fui perceber.
Ou con está nulo ou rs está nulo.
Aliás, você disse que está acompanhando vídeo aula, qual seria?

Pois, normalmente cria-se o preparedstatement, assim:

pst = con.prepareStetament("SELECT bla, bla1, bla2 FROM table").;
1 curtida

Pois é agora que você falou isso acho que me deu uma dica de onde estaria o erro. Na parte de insert eu fiz dentro do próprio jframe inclusive tive que abrir e fechar a conexão com todos manualmente. Fiz desta forma dentro do botão salvar:

private void botSalvarActionPerformed(java.awt.event.ActionEvent evt) {

       try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn;
        conn = DriverManager.getConnection("jdbc:mysql://localhost/estoque?useSSL=false", "root", "");
        String query = "INSERT INTO produto (nome, marca, quantidade, peso, compra, venda) VALUES(?,?,?,?,?,?)";
        
        try (PreparedStatement stm = conn.prepareStatement(query)) {
            System.out.println("Nome "+barraNome.getText()); stm.setString(1, barraNome.getText());
            System.out.println("Marca "+barraMarca.getText()); stm.setString(2, barraMarca.getText());
            System.out.println("Quantidade "+barraQuantidade.getText()); stm.setString(3, barraQuantidade.getText());
            System.out.println("Peso "+barraPeso.getText()); stm.setString(4, barraPeso.getText());
            System.out.println("Compra "+barraCompra.getText()); stm.setString(5, barraCompra.getText());
            System.out.println("Venda "+barraVenda.getText()); stm.setString(6, barraVenda.getText());
            stm.executeUpdate();
            
        }
        conn.close();
        
    } catch (ClassNotFoundException ex) {
        JOptionPane.showMessageDialog(null, "Não foi possível encontrar a classe!\n"+ ex.getMessage());
    }catch (SQLException ex){
        JOptionPane.showMessageDialog(null, "Ocorreu um erro de SQL!\n"+ ex.getMessage());
    }

Você acha que o erro foi porque não fiz o preparedstatement dentro da conexão? Mas na video aula que assistir ele não importava o DAO do projeto que era justamente onde estava a parte de insert. A video aula que acompanhei para a criação da tabela foi está:

Este é o video no qual ele faz o comando executaSQL:

Cara, reveja o vídeo e perceba que existem várias diferenças entre o teu código e o que ele utiliza.

Lembrei porque não fiz a conexão igual a dele, ele usa o postgres eu uso o mysql, para a conexão eu usei outro vídeo, dele só peguei o comando executaSQL talvez ai esteja o erro, porque estou pegando uma coisa pra um e outro pra outro, vou tentar padronizar essa conexão talvez resolva meu problema.