Erro que não consigo solucionar

5 respostas
BLV_DOOM_JAVA

Ola pessoal, estou seguindo os exercicios da apostila da Caelum FJ-21 (Quando tiver dinheiro pretendo fazer o curso mesmo)...então...
É logo no inicio da apostila.
Pretendo alterar dados gravados no banco de dados...porém esta dando um erro e não seu porque...eis meus códigos:

package br.com.caelum.jdbc.modelo;
import java.util.Calendar;	// utiliza a classe Calendar

/*
 * 	JavaBean de Contato. Uma classe "Model".
 */
public class Contato {
	
	private Long id;
	private String nome;
	private String email;
	private String endereco;
	private Calendar dataNascimento;
	
	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 getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public Calendar getDataNascimento() {
		return dataNascimento;
	}
	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

}
package br.com.caelum.jdbc.dao;

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

import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.modelo.Contato;

public class ContatoDAO {
	
	// a conexão com o banco de dados
	private Connection connection;
	
	// método construtor de ContatoDAO.
	public ContatoDAO() {
		// fabrica a conexão com o BD.
		this.connection = new ConnectionFactory().getConnection();
	} // fim do construtor ContatoDAO.
	
	// método para adicionar dados no BD.
	public void adiciona( Contato contato ) {
		// String que guarda o comando SQL a ser executado.
		String sql = "insert into contatos ( nome, email, endereco, dataNascimento ) values ( ? , ?, ?, ? )";
		
		// tratamento de erros.
		try {
			// prepared statement para inseção.
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			// seta os valores;
			stmt.setString( 1, contato.getNome() );
			stmt.setString( 2, contato.getEmail() );
			stmt.setString( 3, contato.getEndereco() );
			stmt.setDate( 4, new Date( contato.getDataNascimento().getTimeInMillis() ) );
			
			// execute
			stmt.execute();
			stmt.close();
		} catch( SQLException e ) {
			throw new RuntimeException( e );
		}
	} // fim do método adiciona
	
	// cria uma listagem de todos os registros da tabela contatos.
	public List< Contato > getLista() {
		
		try {
			List< Contato > contatos = new ArrayList< Contato >();
			PreparedStatement stmt = this.connection.prepareStatement( "select * from contatos" );
			ResultSet rs = stmt.executeQuery();
			
			while ( rs.next() ) {
				// criando o objeto Contato.
				Contato contato = new Contato();
				contato.setNome( rs.getString( "nome" ) );
				contato.setEmail( rs.getString( "email" ) );
				contato.setEndereco( rs.getString( "endereco" ) );
				
				// montando a data através do Calendar.
				Calendar data = Calendar.getInstance();
				data.setTime( rs.getDate( "dataNascimento" ) );
				contato.setDataNascimento( data );
				
				// adicionando o objeto à lista.
				contatos.add( contato );
			} // fim do while.
			rs.close(); // fecha o ResultSet rs.
			stmt.close(); // fecha o PreparedStatement stmt.
			return contatos;
		} catch ( SQLException e ) {
			throw new RuntimeException( e );
		}
		
	} // fim do método getLista
	
	// retorna um contato resultante de uma consulta no BD.
	public Contato pesquisar( int id ) {
		
		String sql = "select * from contatos where id = ?";
		
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setInt(1, id);
			ResultSet rs = stmt.executeQuery();
			
			Contato contato = new Contato();
			
			while ( rs.next() ) {
			
			contato.setNome( rs.getString( "nome" ) );
			contato.setEmail( rs.getString( "email" ) );
			contato.setEndereco( rs.getString( "endereco" ) );
			
			Calendar data = Calendar.getInstance();
			data.setTime( rs.getDate( "dataNascimento" ) );
			contato.setDataNascimento( data );
			} // fim do while
			
			rs.close();
			stmt.close();
			
			return contato;
		} catch (SQLException e) {
			throw new RuntimeException( e );
		}
		
	} // fim do método pesquisar.
	
	// altera dados no BD
	public void altera( Contato contato ) {
		String sql = "update contatos set nome = ?, email = ?, endereco = ?, dataNascimento = ? where id = ?";
		
		try {
			PreparedStatement stmt = connection.prepareStatement( sql );
			stmt.setString(1, contato.getNome() );
			stmt.setString(2, contato.getEmail() );
			stmt.setString(3, contato.getEndereco() );
			stmt.setDate(4, new Date( contato.getDataNascimento().getTimeInMillis() ) );
			stmt.setLong(5, contato.getId() );
			stmt.execute();
			stmt.close();
		} catch( SQLException e ) {
			throw new RuntimeException( e );
		}
	} // fim do método altera.
	
	// remove registros do BD
	public void remove( Contato contato ) {
		try {
			PreparedStatement stmt = connection.prepareStatement( "delete from contatos where id = ?" );
			stmt.setLong( 1, contato.getId() );
			stmt.execute();
			stmt.close();
		} catch( SQLException e ) {
			throw new RuntimeException( e );
		}
	} // fim do método remove.

} // fim da classe ContatoDAO
package br.com.caelum.jdbc.teste;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner;

import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaAltera {
	
	public static void main ( String[] args ) {
		
		Scanner input = new Scanner( System.in ); // objeto Scanner para entrada de dados via teclado.
		
		ContatoDAO dao = new ContatoDAO(); // objeto para acesso ao banco de dados.
		Contato contato = new Contato();
		List<Contato> contatos = dao.getLista();
		
		
		// pesquisa pelo id.
		System.out.print( "Enter id: " ); // prompt
		contato = dao.pesquisar( input.nextInt() );
		
		contato.setNome( "Meu nome" );
		contato.setEmail( "Meu email" );
		contato.setEndereco( "Meu endereco" );
		
		contato.setDataNascimento( Calendar.getInstance() );
		
		// utiliza método altera do objeto DAO.
		dao.altera( contato );
		
		// exibe os contatos.
		for ( Contato contato2 : contatos ) {
			
			System.out.println( "Nome: " + contato.getNome() );
			System.out.println( "Email: " + contato.getEmail() );
			System.out.println( "Endereço: " + contato.getEndereco() );
			// processo para formatar a data.
			String data2 = new SimpleDateFormat( "dd/MM/yyyy" ).format( contato.getDataNascimento().getTime() );
			System.out.println( "Data de Nascimento: " + data2 );
		} // fim do for.
		
	}
}

O que acontece é quando rodo o TestaAltera surge o erro:

Exception in thread "main" java.lang.NullPointerException
at br.com.caelum.jdbc.dao.ContatoDAO.altera(ContatoDAO.java:126)
at br.com.caelum.jdbc.teste.TestaAltera.main(TestaAltera.java:33)

Ja tentei resolver tentando incluir um setId para que o método utilize o numero fornecido no pesquisar, porém quando faço isso ele altera todos os dados do BD.

Alguém pode ajudar?

5 Respostas

joeroots

cara o erro e simples na hora que vc criou o objeto, la na classe principal vc nao setou nenhum id pro objeto.
Entao vc o envia pro dao e o dao inseri um id no banco, mas vc nao tem nenhum id setado, logo vc tem uma propriedade nula e isso gera um erro ^^.
isso poderia ser resolvido usando um simples setId( id desejado ), na classe principal


Veja bem, nem na sua funcao pesquisar nem na sua classe TestaAltera vc esta setando algum id pro objeto.
Porem no na funcao altera da classe dao vc tenta inserir um id na consulta, mas como vc nao setou nenhum id, ele sera nulo e isso gera um erro. Entende?

Cya.

rogelgarcia

O erro está nessa linha (de acordo com o stacktrace):

stmt.setLong(5, contato.getId() );

Se vc quer alterar o contato… ele tem que ter um id…


Se vc nao entender o porque desse erro… (que nao está relacionado com banco de dados)

Nao passe para a proxima licao… volte e estude um pouco mais sobre Orientacao a Objetos…


BLV_DOOM_JAVA

Cara,
Obrigado...eu não consegui enxegar isso....
eu fiz o que falou porém no método pesquisar que eu estou utilizando...
ficou assim:

// retorna um contato resultante de uma consulta no BD.
	public Contato pesquisar( int id ) {
		
		String sql = "select * from contatos where id = ?";
		
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setInt(1, id);
			ResultSet rs = stmt.executeQuery();
			
			Contato contato = new Contato();
			
			while ( rs.next() ) {
			
			contato.setId( new Long( rs.getLong( "id" ) ) );
			contato.setNome( rs.getString( "nome" ) );
			contato.setEmail( rs.getString( "email" ) );
			contato.setEndereco( rs.getString( "endereco" ) );
			
			Calendar data = Calendar.getInstance();
			data.setTime( rs.getDate( "dataNascimento" ) );
			contato.setDataNascimento( data );
			} // fim do while
			
			rs.close();
			stmt.close();
			
			return contato;
		} catch (SQLException e) {
			throw new RuntimeException( e );
		}
		
	} // fim do método pesquisar.

Assim esta funcionando...muito obrigado mesmo!

BLV_DOOM_JAVA

rogelgarcia:
O erro está nessa linha (de acordo com o stacktrace):

stmt.setLong(5, contato.getId() );

Se vc quer alterar o contato… ele tem que ter um id…


Se vc nao entender o porque desse erro… (que nao está relacionado com banco de dados)

Nao passe para a proxima licao… volte e estude um pouco mais sobre Orientacao a Objetos…


Rapaz…eu li sobre isso…o que acontece, eu não reparei que meus métodos não estavam puxando id quando consultavam o BD. Ai por isso não estava entendendo
o porque de o programa falar que haviam referencias para espaços null.
Mas agora esta resolvido…prestarei mais atenção nesses ponto, pois eu ja estudei sobre essas exceções…foi uma falta de atenção de minha parte.
Valeu.

rogelgarcia

NullPointer é um dos piores erros para se achar a solução mesmo … hehehe

O pior é quando dá um nullpointer lá dentro de uma biblioteca que vc tá usando… aí… resolver é osso…

Criado 11 de julho de 2010
Ultima resposta 11 de jul. de 2010
Respostas 5
Participantes 3