Não consigo inserir dados no meu banco em HSQLDB

20 respostas
KarlosKatu

Bom dia pessoal, estou com o seguinte problema:
estou tentando criar um programa básico de cadastro de clientes com interface gráfica feita no netbeans, primeiramente fiz e não usei banco de dados nenhum e deu certo, então resolvi implementar o banco de dados HSQLDB em modo Standalone para esta aplicação simples.
Eu consegui conectar o programa ao banco de dados, mas quando tento cadastrar o usuário, ele apresenta o seguinte erro:

Exception in thread AWT-EventQueue-0 java.lang.NullPointerException

at comercialsimples.TelaCadastroCliente.GravarActionPerformed(TelaCadastroCliente.java:345)

at comercialsimples.TelaCadastroCliente.access$300(TelaCadastroCliente.java:17)

at comercialsimples.TelaCadastroCliente$4.actionPerformed(TelaCadastroCliente.java:288)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)

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:6505)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)

at java.awt.Component.processEvent(Component.java:6270)

at java.awt.Container.processEvent(Container.java:2229)

at java.awt.Component.dispatchEventImpl(Component.java:4861)

at java.awt.Container.dispatchEventImpl(Container.java:2287)

at java.awt.Component.dispatchEvent(Component.java:4687)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)

at java.awt.Container.dispatchEventImpl(Container.java:2273)

at java.awt.Window.dispatchEventImpl(Window.java:2719)

at java.awt.Component.dispatchEvent(Component.java:4687)

at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)

at java.awt.EventQueue.access$200(EventQueue.java:103)

at java.awt.EventQueue$3.run(EventQueue.java:688)

at java.awt.EventQueue$3.run(EventQueue.java:686)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)

at java.awt.EventQueue$4.run(EventQueue.java:702)

at java.awt.EventQueue$4.run(EventQueue.java:700)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

a seguir, o código de cadastro do usuário:

package comercialsimples;

import Classes.Cliente;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Conexão {
        Statement stmt = null;
        ResultSet result;
        Connection c;
        String aux;

        public void inserir(Cliente client){
            try {
            c = DriverManager.getConnection("jdbc:hsqldb:file:testdb", "sa", "");
                stmt = c.createStatement();
                aux = client.getNome();
                stmt.execute("INSERT INTO USUARIOS (nome) VALUES ('" + aux + "')");
    //            stmt.execute("CREATE TABLE Usuarios (nome VARCHAR(100) NOT NULL);");
                stmt.executeUpdate("shutdown");
                c.commit();
                stmt.close();
            c.close();
            } catch (SQLException ex) {
                Logger.getLogger(ComercialSimples.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
}

[EDIT]

Galera, fiz um método de pesquisa só pra testar e deu o mesmo erro em conexão, então o problema se encontra em conexão, a seguir código atualizado:

package comercialsimples;

import Classes.Cliente;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Conexão {
        Statement stmt;
        ResultSet result;
        Connection c;
        String aux;
    private ResultSet res;

        public void inserir(Cliente client){
            try {
            c = DriverManager.getConnection("jdbc:hsqldb:file:testdb", "sa", "");
                stmt = c.createStatement();
                aux = client.getNome(); 
                stmt.execute("INSERT INTO USUARIOS (nome) VALUES ('" + aux + "')");
    //            stmt.execute("CREATE TABLE Usuarios (nome VARCHAR(100) NOT NULL);");
                stmt.executeUpdate("shutdown");
                c.commit();
                stmt.close();
            c.close();
            } catch (SQLException ex) {
                Logger.getLogger(ComercialSimples.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        public void pesquisar() throws SQLException{
            c = DriverManager.getConnection("jdbc:hsqldb:file:testdb", "sa", "");
            stmt = c.createStatement();
            stmt.executeQuery("SELECT * FROM USUARIOS"); 
                res = stmt.getResultSet(); 
                while(res.next()){ 
                    System.out.println(res.getString("firstname")); 
                } 
            stmt.executeUpdate("shutdown");
            c.commit();
            stmt.close();
            c.close();
        }
}

20 Respostas

igor_ks

O erro é um NullPointerException nessa classe TelaCadastroCliente.java e nessa linha: :345

Veja o que está nulo, e tente corrigir

ErickRAR

Provavelmente falta o Class.ForName na sua conexão.

Você pode criar um método para conexão, assim não tem que reescrever o código diversas vezes:

public static Connection getConnection(){ try { Class.forName("com.mysql.jdbc.Driver"); //Essa Linha aqui. return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", ""); } catch (SQLException e) { throw new RuntimeException(e); } }

Depois, nos seus método, basta utilizar:

c = SuaClasseDeConexao.getConnection();

ps: depois que estiver familiarizado com isso, use o search do guj e procure por PreparedStatement . Tem diversos tópicos ensinando como e porquê utiliza-los.

KarlosKatu

@igor_ks: justamente igor, nesta linha de código, há um chamado pro método inserir da classe Conexão e eu procurei nesta classe se havia algo nulo e não consegui perceber, por isso gostaria da ajuda de vocês do fórum para que eu possa corrigir o problema;

@ErickRAR: Eu fiz o que você sugeriu e continua o mesmo erro, procurei em todo o código de conexão com o BD por algo nulo sendo enviado mas não achei, então estou num mato sem cachorro.

[EDIT]
Pessoal, como já disse implementei um teste de pesquisa apenas para ver se o banco esta funcionando e no editor do banco de dados cadastrei um nome na tabela USUARIOS, então eu chamei o metodo de pesquisa na tela de teste, onde nesta tela eu tenho apenas um botão com o nome teste e ao clicar neste botão ele faz uma pesquisa pré-configurada com a seguinte Query: “SELECT * FROM usuarios” e uso um resultset para receber o resultado, após receber este resultado eu mando o resultset printar o que há nele no console, mas ao invés de printar ele retorna com o mesmo erro, de quando eu fui inserir: NullPointerException
O código de pesquisa é este:

public void pesquisar() throws SQLException{
            c = getConnection();
            stmt = c.createStatement();
            stmt.executeQuery("SELECT * FROM USUARIOS"); 
                res = stmt.getResultSet(); 
                while(res.next()){ 
                    System.out.println(res.getString("firstname")); 
                } 
            stmt.executeUpdate("SHUTDOWN");
            c.commit();
            stmt.close();
            c.close();
        }

e está contido na classe conexão que eu já mostrei no post anterior.

ErickRAR

Olha o seu getConnection. A sintaxe correta é:

DriverManager.getConnection("jdbc:SEU_BANCO://ENDERECO_DO_BANCO/NOME_DA_BASE", "USUARIO", "SENHA");

No seu está file:testdb ao invés do endereço/nome_da_base.

R

@KarlosKatu, vc não acha que seria este Resultset que está retornando nulo?

KarlosKatu

@ErickRAR: Desculpa Erick, esqueci de dizer que meu banco de dados está em modo StandAlone, o que significa que eu utilizo um arquivo para salvar os dados, não um server, por isso essa configuração file:testdb;

@ragnarok: Não, pq quando eu usei o Editor do BD, eu criei um nome para usuario que como padrão está “karlos”, que é o que eu adicionei no editor e eu pesquiso por ele, então ele deveria retornar algo, a menos que eu esteja utilizando o ResultSet de forma errada e não consiga retirar o valor dele, mas não sendo isso, acho que ele recebe valor sim.

R

Tenta fazer o seguinte: Coloca um print em cada execução e veja até onde o print vai aparecer e poste aqui

KarlosKatu

Estranho, eu coloquei JOptionPane em todas as execuções e quando eu aperto no botão teste, não aparece nenhuma janela, é como se o erro impedisse tudo.
Aqui esta como ficou o código teste de pesquisa:

public void pesquisar() throws SQLException{
            JOptionPane.showMessageDialog(null, "Conectado!");
            c = getConnection();
            JOptionPane.showMessageDialog(null, "Conectado!");
            stmt = c.createStatement();
            JOptionPane.showMessageDialog(null, "Statement Criado!");
            stmt.executeQuery("SELECT * FROM USUARIOS"); 
            JOptionPane.showMessageDialog(null, "Query sendo executada!");
            res = stmt.getResultSet(); 
            JOptionPane.showMessageDialog(null, "ResultSet!");
            while(res.next()){ 
                JOptionPane.showMessageDialog(null, "Inicio do While!");
                System.out.println(res.getString("firstname")); 
            } 
            JOptionPane.showMessageDialog(null, "Fim do While!");
            stmt.executeUpdate("SHUTDOWN");
            JOptionPane.showMessageDialog(null, "Shutdown!");
            c.commit();
            JOptionPane.showMessageDialog(null, "Commit!");
            stmt.close();
            JOptionPane.showMessageDialog(null, "Statement fechado!");
            c.close();
            JOptionPane.showMessageDialog(null, "Conexão encerrada!");
        }

[EDIT]
Inclusive acabei de tentar com o println e não funcionou do mesmo jeito, não sei o que pode ser e cada vez que clico no botão o erro repete.

R

estranho, tenta colocar um try e catch ou invés de usar o Throws pra ver se funciona.

KarlosKatu

Já fiz isso @ragnarok, mas deu a mesma coisa, não sei mais o que fazer :confused:

R

Cara, andei pesquisando sobre o seu problema, o NullPointException acontece quando algo recebe o valor nulo, então você tem que procurar onde se encontra o erro esse valor nulo e como você já disse que o erro estava em conexão, então comece por ai, fica a dica.

KarlosKatu

Eu olhei em todo o código e parece estar tudo nos conformes, por favor gente ajuda ai, to precisando dessa força.

R

Cara, olha isso que eu encontrei, tenta fazer no teu código pra ver se funciona:
http://www.guj.com.br/java/127672-awt-eventqueue-0-javalangnullpointerexception-como-resolver

ErickRAR

O arquivo está no diretório certo?
Crie um diretório banco apenas para teste.

KarlosKatu

@ragnarok: Eu coloquei o static em todos os statement, connection e resultset, mas continua o erro de NullPointException

@ErickRAR: Eu fiz isso e continuou o erro, mas eu acho q ele reconhece o banco, até porque eu coloquei pra ele criar uma tabela assim q iniciar o programa e como a tabela já estava criada ai aparece avisando que a tabela já foi criada o que mostra que o banco está funcionando o problema está no código e só pra constar eu já retirei essa codificação pra criar uma nova tabela ao iniciar o programa, era só pra teste mesmo.

R

Então tenta da uma olhada nisso pra ver se resolve o seu problema:
http://javafree.uol.com.br/topic-886587-javalangNullPointerException.html

KarlosKatu

@ragnarok: Desculpa a ignorância, mas eu não sei como fazer um debug no Netbeans e também não sei como popular a minha conexão pelo statement e pelo ResultSet, você poderia me explicar melhor?

[EDIT]: Ah ta, debug é o mesmo que depurar, eu fiz sim o debug e deu tudo certo, falou que foi construido com sucesso!
Mas quanto ao popular as outras coisas, continuo sem saber.

R

Cara, popular é encher essas variáveis com algum valor, valor este que é adicionado a o ResultSet e ao Statement, então pelo que eu li no link que te mandei, você deve colocar os valores padrões neles.

KarlosKatu

Qual é o valor padrão deles?

R

Cara, posta o código completo aqui pra eu dar uma olhada.

Criado 28 de janeiro de 2014
Ultima resposta 5 de fev. de 2014
Respostas 20
Participantes 4