NullPointerException - ID Banco de dados

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”

[code]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;
}

}
[/code]

Aqui, a classe onde eu rodo o programa.

[code]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();
	
	
	
	
	
}

}[/code]

o erro é o seguinte

[quote]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)
[/quote]

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

cara,

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

t+

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

[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

Po cara, eu reparei uma coisa, mesmo ele dando o NullPointer, ele ta salvando os valores.
eu fiz um método

[code] List 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());
	}[/code]

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!

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.

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

eu criei minha tabela usando o código:

[quote]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));
[/quote]

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

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);  
    } 

Sem erros fazendo isso.