NullPointerException - ID Banco de dados

8 respostas
E

Galera, meu erro é o seguinte.
Eu tenho um tabela chamada "clientes", nela eu possuo o "id, nome, telefone, e endereço.
o ID é AUTO_INCREMENT

Eu fiz a classe do java, tudo certinho, de acordo com a apostila fj21

aqui vai o código
package engenharia_de_software.Cliente;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import engenharia_de_software.ConnectionFactory;

public class ClienteDAO {

	private Connection con;

	public ClienteDAO() {
		this.con = new ConnectionFactory().getConnection();
	}

//////////////////////////////////////MÉTODO PARA ADICIONAR//////////////////////////////	
	public void adiciona(Cliente cliente) {
		String sql = "insert into clientes (nome,telefone,endereco) values(?,?,?)";
		try {
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setString(1, cliente.getNome());
			stmt.setString(2, cliente.getTelefone());
			stmt.setString(3, cliente.getEndereco());

			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

//////////////////////////////////////MÉTODO PARA MOSTRAR//////////////////////////////	
	public List<Cliente> getList() {
		try {
			PreparedStatement stmt = this.con
					.prepareStatement("select*from clientes");
			ResultSet rs = stmt.executeQuery();
			List<Cliente> clientes = new ArrayList<Cliente>();
			while (rs.next()) {
				Cliente cliente = new Cliente();
				cliente.setId(rs.getLong("id"));
				cliente.setNome(rs.getString("nome"));
				cliente.setTelefone(rs.getString("telefone"));
				cliente.setEndereco(rs.getString("endereco"));
				
				clientes.add(cliente);

			}
			rs.close();
			stmt.close();
			return clientes;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
//////////////////////////////////////MÉTODO PARA REMOVER//////////////////////////////		
	public void remove(Cliente cliente){
		try {
			PreparedStatement stmt = con.prepareStatement("delete from clientes where id=?");
			stmt.setLong(1, cliente.getId());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException();
		}
		
	}

//////////////////////////////////////MÉTODO PARA ALTERAR//////////////////////////////	
	public void altera(Cliente cliente){
		String sql ="update clientes set nome=?, telefone=?, endereco=? where id=?";
		try{
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setString(1, cliente.getNome());
			stmt.setString(2, cliente.getTelefone());
			stmt.setString(3, cliente.getEndereco());
			stmt.setLong(5, cliente.getId());

			stmt.execute();
			stmt.close();
			
		}catch (SQLException e){
			throw new RuntimeException();
		}
	}
	
	
	
	

}

aqui a classe "Cliente"

package engenharia_de_software.Cliente;

public class Cliente {
	private String nome, endereco, telefone;
	private Long id;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}
	
	

}

Aqui, a classe onde eu rodo o programa.

package engenharia_de_software;

import engenharia_de_software.Cliente.Cliente;
import engenharia_de_software.Cliente.ClienteDAO;
import engenharia_de_software.Cliente.MetodosClient;

public class Principal {

	public static void main (String args[]){
		
		Cliente c = new Cliente();
		ClienteDAO dao = new ClienteDAO();
		
		c.setNome("Eliezer");
		c.setEndereco("SHA CJ 4 CH 72 LOTE R");
		c.setTelefone("3401-1956");
		dao.adiciona(c);
		
		
		
		MetodosClient m = new MetodosClient();
		m.listarProdutos();
		dao.remove(c);
		m.listarProdutos();
		
		
		
		
		
	}
	

}

o erro é o seguinte

Exception in thread "main" java.lang.NullPointerException at engenharia_de_software.Cliente.ClienteDAO.remove(ClienteDAO.java:69) at engenharia_de_software.Principal.main(Principal.java:23)

Como podem ver, ele dá no ID do meu objeto.
Gostaria que a galera me ajudassem a resolver o problema.
Valeu
Abraço!

8 Respostas

A

cara,

vc tem que setar o id do seu objeto Cliente, por isso acho q está acontendo o erro.

t+

E

então cara, esse é o meu problema, como eu vou setar ele com o id do banco de dados.
pq o id na minha tabela é auto increment.
ja tentei setar quando eu adiciono o objeto no banco + nao funcionou

Master.Abs

[editado] Esse cod abaixo serve para que o id seja incrementado automáticamente ao adicionar alguem.

//Primeiro voce deve pegar o maximo do id
String sql = "SELECT MAX(id) FROM usuario";
			ps = factory.getConnection().prepareStatement(sql);
			rs = ps.executeQuery();
			rs.next();

			int incrementedID= rs.getInt(1); //1 é a minha posição da tabela que contem o ID
			sql = "INSERT INTO usuario VALUES(?,?,?,?,?)";
			ps = factory.getConnection().prepareStatement(sql);
			ps.setInt(1, ++incrementedID); // Aqui está sendo setado o ID e a cada vez que salvar o id será encrementado.

O que eu pude perceber é que o método remove está vindo como null pois a chamada

stmt.setLong(1, cliente.getId());

está pegando a primeira posição da tabela que provavelmente deve ser nome e não ID (Suposição)

O ideal seria voce fazer:

stmt.setLong("ID", cliente.getId()); 
//ou
stmt.setLong(5, cliente.getId()); //Posição que o ID se encontra.

Flw

E
Po cara, eu reparei uma coisa, mesmo ele dando o NullPointer, ele ta salvando os valores. eu fiz um método
List<Cliente> clientes = dao.getList();
		
		for (Cliente p : clientes){
			System.out.println("\nNome: "+p.getNome());
			System.out.println("Telefone: "+p.getTelefone());
			System.out.println("Endereço: "+p.getEndereco());
			System.out.println("ID: "+p.getId());
		}

ele mostra o ID tambem.
Teoriacamente acredito eu que era p/ dar um erro de NullPointer tambem, mas p/ minha surpresa nao deu, ele está armazenando o ID junto com o objeto.

agora ficou a dúvida, porque só no método de remover?

Valeu a ajuda de todos!

Master.Abs

Porque no método remover ao chamar remove ele tenta encontrar o id e não encontra devido ao mapeamento da posição da coluna que provavelmente esteja incorreto.

Realmente ele salva pois o NullPointerException ocorre no REMOVE e os métodos anteriores são executados normalmente.

E
  • a coluna “id” é a coluna 1 cara.
    pelo menos eu imagino que seja.

eu criei minha tabela usando o código:

create table clientes(
id BIGINT NOT NULL AUTO_INCREMENT,
nome VARCHAR(255) NOT NULL,
telefone VARCHAR(255) NOT NULL,
endereco VARCHAR(255) NOT NULL,
primary key(id));

se for algum vacilo meu, é porque eu sou meio leigo ainda em programar usando banco de dados.

e quando eu uso o “select * from clientes” ele me mostra a coluna id como sendo a primeira tambem

Master.Abs

tente testar isso ai.

public static void main (String args[]){  
          
        Cliente c = new Cliente();  
        ClienteDAO dao = new ClienteDAO();  

//Tente adicionar o id que ele deve remover para ver se funciona
          c.setId(1); 
        dao.remove(c);  
    }
E

Sem erros fazendo isso.

Criado 25 de outubro de 2011
Ultima resposta 25 de out. de 2011
Respostas 8
Participantes 3