Erro ao inserir no banco do sqlite, ta dando erro no primeiro get do prepare e eu nao sei pq

22 respostas
sqlitejava
N

package Contas;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.util.Scanner;

import javax.swing.JOptionPane;

import BancoConexao.Banco;

public class ContaCorrente extends Conta{

public ContaCorrente(int NumConta,String nome,float Saldo,String senha,int tipo) {

super(NumConta, nome, Saldo, senha, tipo);

}

public void Cad() {

Banco ContCorrente = new Banco();

ContCorrente.conectar();

String sql = INSERT INTO ContaCliente(

+ NumeroConta,

+ Nome,

+ Saldo,

+ Senha,

+ Tipo

+ ) VALUES(?,?,?,?,?)

+";";
JOptionPane.showMessageDialog(null,"Cadastrado!");
        PreparedStatement prepare = ContCorrente.criarPreparedStatement(sql);
        
        try{
                    // esta dando erro nesse primeiro prepare que criei
        	prepare.setInt(1,getNumConta());
        	prepare.setString(2,getNome());
        	prepare.setFloat(3,getSaldo());
        	prepare.setString(4,getSenha());
        	prepare.setInt(5,getTipo());
            prepare.executeUpdate();
        }catch(SQLException e){
            System.out.println("Erro ao Cadastrar");
        }finally{
            if(prepare != null){
                try {
                    prepare.close();
                } catch (SQLException ex) {
                    System.out.println("Erro ao fechar o banco");
                }
            }
        }
        ContCorrente.desconectar();
}

}

22 Respostas

D

Se esta é a classe toda, realmente vai dar erro, afinal, não existe um método chamado getNumConta(); O erro está referenciando esta linha por ela conter o primeiro erro, mas, provavelmente, exista erro em todos os gets.
Tem certeza que não devia indicar de qual objeto estes gets vêm?

N

eles vem da super classe Conta, ja testei tirar eles e por algum valor no lugar e da o mesmo erro.

V

Tira o get da frente, para usar o get você precisa de um objeto:
exemplo: seuObjeto.getNumConta();

No caso parece que você tem a variável que tem nome NumConta.

D

Ele já explicou que os métodos pertencem a superclasse que ele omitiu.
Para ter mais assertividade, precisamos saber qual o erro indicado.

N

da no mesmo erro

N
Exception in thread main java.lang.NullPointerException

at Contas.ContaCorrente.Cad(ContaCorrente.java:30)

at Principal.main(Principal.java:32)
D

Veja o que está sendo retornado no

Provavelmente está retornando null.

N

public PreparedStatement criarPreparedStatement(String sql) {

try{
            return this.c.prepareStatement(sql);
                    
        } catch(SQLException e){
            return null;
        }
        }

ta normal, ele ta retornar a conexao que criei

D

Não, não está normal.
Está caindo no catch e você matou a captura da exceção, retornando nulo.
Sugiro que coloque, ao menos, um

e.printStackTrace();

onde o objeto c é instanciado?

N

package Contas;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.util.Scanner;

import javax.swing.JOptionPane;

import BancoConexao.Banco;

public class ContaCorrente extends Conta{

public ContaCorrente(int NumConta,String nome,float Saldo,String senha,int tipo) {

super(NumConta, nome, Saldo, senha, tipo);

}

public void Cad() {
ContCorrente.conectar();
	String sql = "INSERT INTO ContaCliente("
            + "NumeroConta,"
            + "Nome,"
            + "Saldo,"
            + "Senha,"
            + "Tipo"
            + ") VALUES(?,?,?,?,?)"
            +";";
   
        JOptionPane.showMessageDialog(null,"Cadastrado!");
        PreparedStatement prepare = ContCorrente.criarPreparedStatement(sql);
        
        try{
        	prepare.setInt(1,getNumConta());
        	prepare.setString(2,getNome());
        	prepare.setFloat(3,getSaldo());
        	prepare.setString(4,getSenha());
        	prepare.setInt(5,getTipo());
            prepare.executeUpdate();
        }catch(SQLException e){
            System.out.println("Erro ao Cadastrar");
        }finally{
            if(prepare != null){
                try {
                    prepare.close();
                } catch (SQLException ex) {
                    System.out.println("Erro ao fechar o banco");
                }
            }
        }
        ContCorrente.desconectar();
}

}
codigo completo para ver melhor

D

Mantenho o que disse.
O problema aparece na classe que você postou, mas, ele ocorre na outra classe.

N

onde coloco isso?

D

Sempre que você tem um trecho de código que pode causar alguma falha, exceção, você circunda com try/catch.
Agora, aqui

Você matou o catch, colocando “return null”

Ele está entrando neste catch, porém, creio que seja por conta do objeto c estar nulo.
Onde você o instancia?

N

package BancoConexao;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.sql.Statement;
public class Banco {

Connection c = null;

public boolean conectar(){
try {

Class.forName(“org.sqlite.JDBC”);

c = DriverManager.getConnection(“jdbc:sqlite:Banco.db);

} catch ( Exception e ) {

System.err.println( e.getClass().getName() + ": " + e.getMessage() );

System.exit(0);

}

return true;

}
public boolean desconectar(){

    
    try{
                
            c.close();         
         }catch(SQLException e){
             System.err.println(e.getMessage());
            return false;
         }
          return true;    
    }
    
    public Statement criarStatement() {
        
        try{
            return this.c.createStatement();
                    
        } catch(SQLException e){
        	e.printStackTrace();
            return null;
        }
        }
    
    public Connection GetC(){        
       return this.c;
     }
    
    public PreparedStatement criarPreparedStatement(String sql) {
        
        try{
            return this.c.prepareStatement(sql);
                    
        } catch(SQLException e){
            return null;
        }
        }

}
la em cima, ai o codigo da conexao

V

Sempre que fizer um setNumConta e setTipo cria um try catch, e no catch coloca um valor default, eu utilizo o valor default -1, que é mais fácil para verificar depois os registros que foram inseridos de forma errada.

D

Agora com e.printStatckTrace no código, qual foi o erro lançado?

N
java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such table: ContaCliente)

at org.sqlite.DB.newSQLException(DB.java:383)

at org.sqlite.DB.newSQLException(DB.java:387)

at org.sqlite.DB.throwex(DB.java:374)

at org.sqlite.NativeDB.prepare(Native Method)

at org.sqlite.DB.prepare(DB.java:123)

at org.sqlite.PrepStmt.(PrepStmt.java:42)

at org.sqlite.Conn.prepareStatement(Conn.java:404)

at org.sqlite.Conn.prepareStatement(Conn.java:399)

at org.sqlite.Conn.prepareStatement(Conn.java:383)

at BancoConexao.Banco.criarPreparedStatement(Banco.java:54)

at Contas.ContaCorrente.Cad(ContaCorrente.java:27)

at Principal.main(Principal.java:32)

Exception in thread main java.lang.NullPointerException

at Contas.ContaCorrente.Cad(ContaCorrente.java:30)

at Principal.main(Principal.java:32)
D

Basicamente, não encontrou a tabela referida na query.
Logo, você precisa se certificar de que esta tabela existe, caso não, criá-la. Caso exista, precisa certificar-se que o nome da mesma está correto na query.

N

a Tabela existe no banco, eu criei o banco normal sem ser em java, será por isso?

V

Será que não criou a mesma tabela 2 vezes?
Quando for criar a tabela lembra de por a clausula: create table if not exists

N

será? entao vou excluir e criar dnv a tabela para ver

D

Não há nada que obrigue a usar apenas bancos e tabelas criados através do java.
Agora, o bom seria acessar o banco e certificar-se de que a tabela está lá.

Criado 8 de junho de 2018
Ultima resposta 8 de jun. de 2018
Respostas 22
Participantes 3