Erro NullPointerException

17 respostas
mirrah

bom gente, estou fazendo um projetinho com o JDBC puro. Só que este está dando um erro que eu não estou vendo onde ele está, será que alguma alma caridosa poderia me ajudar com essa erro?

public static Aluno inserirRegistro(String matricula, 
            String email, String senha)
    {
         Aluno aluno = null;

        try
        {
           String sql ="INSERT INTO aluno VALUES(?, NULL, ?, NULL, ?, NULL, NULL)";

            Conexao conex = new Conexao("jdbc:mysql://localhost:3306/mydb",
                    "com.mysql.jdbc.Driver","root","alunolab");

            Connection con = conex.obterConexao();
            
            PreparedStatement comando = con.prepareStatement(sql);
            
            comando.setString(1, matricula);
            comando.setString(3, email);
            comando.setString(5, senha);

            comando.executeUpdate();

            comando.close();
            con.close();

        }catch( Exception exc )
        {
            JOptionPane.showMessageDialog(null, "Não foi possievel fazer o "
                    + "registro, por favor tente mais tarde. " + exc);
        }

         aluno = new Aluno(matricula, email, senha);
         return aluno;
    }

Essa é a classe DAO, eu chamo ela na main e ponho os argumentos quando eu vou rodar dá a exception.

PS: está tudo sintaticamente correto, por isso acho que o erro é meio que de lógica mesmo :D

desde já muito agradecido :)

17 Respostas

pmlm

Aqui deve ser 1, 2 e 3 em vez de 1, 3 e 5.
O que interessa é a ordem dos pontos de interrogação, não o índice dos campos na tabela.

mirrah

pow cara, eu ajeitei, mas a exception continua sendo disparada

Anime

Oi,

Não coloque null…

Aluno aluno ="";

Não entendi isso…

String sql ="INSERT INTO aluno VALUES(?, NULL, ?, NULL, ?, NULL, NULL)";
mirrah

Mas neste caso eu não teria de transformar “aluno” em String?

pmlm

Onde é que dá o erro? Mostra o stacktrace…

Anime

Desculpe, estou morrendo de sono deveria ter ficado quieta rsrs… :oops:
Não estou entendendo nada… :roll:

Espero que ajude!

http://mballem.wordpress.com/2011/02/21/utilizando-swing-com-banco-de-dados/

http://mballem.wordpress.com/2011/02/02/jdbc-com-banco-de-dados-standalone/

mirrah

é… quando eu ponho para executar o netbeans, não aparece nada na saída dele. Mostra como se não estivesse acontecendo nenhum erro. No final só aparece “CONSTRUÍDO COM SUCESSO”. só.

mirrah

Gente eu dei uma depurada no projeto, não sei se fiz certo ou não, mas pelo que eu entendi o que não está ocorrendo direito está na linha 21, só que só tem um probleminha rsrss, eu também não faço a mínima ideia do porque não está funcionando corretamente rsrs

PS: eu já testei o método com o argumento sendo “sql” e ficou a mesma coisa

RafaelCassau

Amigo vamos as dicas, primeiro crie uma classe com os parametros de conexão separada das classes que vão usa-la, exemplo:

package ex1_banco_jdbc;

public class Constantes_MySQL {
	public static final String driver = "com.mysql.jdbc.Driver";
	public static final String url = "jdbc:mysql://localhost/baseTeste";
	public static final String login = "root";
	public static final String senha = "admin";
}

Essa classe é uma classe constante, onde sempre que você precisar você acessa as variaveis dela para criar sua conexão, depois crie uma classe de conexão, que sempre retornara um objeto connection pronto para uso exemplo:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;


public class Conexao {

    public static Connection criarConexaoMysql() throws SQLException, ClassNotFoundException{
		try{
			Class.forName(Constantes_MySQL.driver);
			conn = DriverManager.getConnection(Constantes_MySQL.url, Constantes_MySQL.login, Constantes_MySQL.senha);
			return conn;
		}catch(SQLException ex){
			throw new SQLException("Ocorreu um erro com sua base de dados, informe o Administrador!");
		}catch(ClassNotFoundException ex){
			throw new ClassNotFoundException("Ocorreu um erro com o Driver de Conexão do seu banco de dados, informe o Administrador!");
		}
	}
}

depois, vem o metodo de inserção, mais quando se trabalha com o prepareStatement tenho quase certeza que é necessário passar todos os parametros para o SQL por referencia mesmo sendo nulos, só para esclarecer pN1 = parametro Nulo 1, pN2 = parametro Nulo 2, pN3 = parametro Nulo 3, pN4 = parametro Nulo 4!
pois o prepareStatement trata SQL Injection, que são codigos SQL capazes de burlar o sistema, por isso que se passa os parametros por referencia e não direto na instrução SQL

public static Aluno inserirRegistro(String matricula, String pN1, String email, String pN2, String senha, String pN3, String pN4)  throws SQLException, ClassNotFoundException{
		PreparedStatement st = null;
                Connection conn = null;
		try{
			conn = Conexao.criarConexaoMysql();
			st = conn.prepareStatement("insert into EX2_LEITOR (?, ?, ?, ?, ?, ?, ?)");
			st.setInt(1, matricula);
                        st.setString(2, pN1);
			st.setString(3,email);
                        st.setString(4, pN2);
			st.setString(5,senha);
                        st.setString(6, pN3);
			st.setString(7, pN4);
			st.executeUpdate();
		}catch(SQLException ex){
			throw new SQLException("Ocorreu um erro com sua base de dados, informe o Administrador!");
		}catch(ClassNotFoundException ex){
			throw new ClassNotFoundException("Ocorreu um erro com o Driver de Conexão do seu banco de dados, informe o Administrador!");
		}finally{
			st.close();
			conn.close();
		}
}

só uma ultima duvida, não intendi o seu metodo obterConexao, pois todos os parametros para conexão ja estavam na classe, qual a função dele?

espero ter ajudado!

mirrah

pow cara, escrevi tudo o que vecê postou ai, mas no final está dando um SQLException

RafaelCassau

Posta o print.stackTrace() e o fonte por favor para dar uma analizada!

mirrah

esseé o Ctrl+C Ctrl+V da saída do netbeans:

04/07/2011 23:11:56 testes.Testes main

GRAVE: null

java.sql.SQLException: Ocorreu um erro com sua base de dados, informe o Administrador

at testes.AlunoDAO.inserirRegistro(AlunoDAO.java:53)

at testes.Testes.main(Testes.java:14)

CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
RafaelCassau

por favor o fonte para analizar? inclusive todas as classes que você criou, se possivel?

mirrah

pow cara, eu fiz um outro teste, mudando algumas informações e foi.

acho que estava dando o erro pois no meu banco a primary key é unique. Ai quando eu mudei as informações e testei foi.

Brigadão cra, valeu mesmo rsrsr

abraços

RafaelCassau

que bom, esse é o intuito um ajudando o outro, hehe, mais o importante é entender, vc entendeu o lance do PrepareStatement, que é necessário receber todos os parametros?
pois ele trata SQL Injection, pois pra passar os parametros direto teria que ser com o Statement! sacou?

por favor altere o titulo do topico para [Resolvido]

abraços!!!

mirrah

cara, eu tenho mais uma dúvida noob, quando eu isolo o que exemplo, ele funciona direitinho, mas quando eu insiro ele no meu projeto ele não funciona.

PS: não é problema de banco de dados, estou usando o mesmo banco de dados tanto para o seu exemplo isolado em um novo projeto e para o meu projeto

RafaelCassau

Boa noite, então cara não consegui intender bem o que quiz dizer, por favor tente postar o problema com mais claresa, eu tbm sou noob em enterpretação de textos, hsuahsuahs, tentareui ajudar

Criado 4 de julho de 2011
Ultima resposta 7 de jul. de 2011
Respostas 17
Participantes 4