Caelum fj-21 - Capítulo 2 - ContatoDAO

Sou iniciante em JAVA e baixei a apostila da Caelum de Desenvolvimento para Web.
Estou com um problema no seguinte código:

[code]package br.com.caelum.jdbc.teste;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

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

public class TestaInsere {

/**
 * @param args
 * @throws SQLException 
 */
public static void main(String[] args) throws SQLException {
	
            /*
	// Adicionando dados ao contato
	Contato contato = new Contato();
	
	Scanner input = new Scanner(System.in);
	
	System.out.println("Nome: ");
	contato.setNome(input.nextLine());
	
	System.out.println("Email: ");
	contato.setEmail(input.nextLine());
	
	System.out.println("Endereço: ");
	contato.setEndereco(input.nextLine());
	
	// Criando uma conexão;
	ContatoDAO dao = new ContatoDAO();
	
	// Inserindo dados no BD
	 dao.adiciona(contato);
	*/

	ContatoDAO dao = new ContatoDAO();
	
	List<Contato> contatos = dao.getLista();
	
	for (Contato contato: contatos) {
		System.out.println("Nome: " + contato.getNome());
		System.out.println("Email: " + contato.getEmail());
		System.out.println("Endereço: " + contato.getEndereco() + "\n");
		}
	
}

}[/code]

[code]package br.com.caelum.jdbc.dao;

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

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

public class ContatoDAO {

Connection  con;
public ResultSet rs;

// Conexão com o BD
public ContatoDAO() throws SQLException {
	this.con = ConnectionFactory.getConnection();
}

public void adiciona(Contato contato) throws SQLException {
	// Preparando o PreparedStatemend para a inserção
	String sql = "INSERT INTO contatos (nome, email, endereco) " +
			"VALUES (?,?,?)";
	PreparedStatement stmt = con.prepareStatement(sql);
	
	// Setando os valores
	stmt.setString(1, contato.getNome());
	stmt.setString(2, contato.getEmail());
	stmt.setString(3, contato.getEndereco());
	
	stmt.execute();
	stmt.close();
}

public List<Contato> getLista() throws SQLException {
	PreparedStatement stmt = con.prepareStatement("SELECT * FROM contatos");
	stmt.executeQuery();
	
	List<Contato> contatos = new ArrayList<Contato>();
	
	do {
		Contato contato = new Contato();
		contato.setNome(rs.getString("nome"));
		contato.setEmail(rs.getString("email"));
		contato.setEndereco(rs.getString("endereco"));
		
		contatos.add(contato);
	} while(rs.next());
			
	rs.close();
	stmt.close();
			
	return contatos;
}

}[/code]

Neste trecho está dando a seguinte exceção:
Exception in thread “main” java.lang.NullPointerException
at br.com.caelum.jdbc.dao.ContatoDAO.getLista(ContatoDAO.java:47)
at br.com.caelum.jdbc.teste.TestaInsere.main(TestaInsere.java:42)

Não estou conseguindo corrigir rsrs
O erro ocorre por correr o risco das List’s não estarem instanciadas?

[]'s

Você esqueceu de atribuir o resultado da consulta no seu resultSet na linha 40

public List getLista() throws SQLException {
PreparedStatement stmt = con.prepareStatement(“SELECT * FROM contatos”);
rs = stmt.executeQuery();

tenta isso!

Tem certeza que a caelum tá te ensinando a fazer isso:public ResultSet rs;???

[quote=fmad27]Você esqueceu de atribuir o resultado da consulta no seu resultSet na linha 40

public List getLista() throws SQLException {
PreparedStatement stmt = con.prepareStatement(“SELECT * FROM contatos”);
rs = stmt.executeQuery();

tenta isso![/quote]
adicionando isso apareceram os seguintes erros:
Exception in thread “main” java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:835)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5571)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5491)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5531)
at br.com.caelum.jdbc.dao.ContatoDAO.getLista(ContatoDAO.java:46)
at br.com.caelum.jdbc.teste.TestaInsere.main(TestaInsere.java:41)

é uma boa você declarar o seu resultSet dentro do seu método, pode ser isso.

eu já fiz isso!
declarei ele fora para testar se era esse o motivo do erro e esqueci de desfazer depois
ele está dentro do método e o erro continua rsrs

Olá FerTriPa,

o você precisa chamar o next() do ResultSet antes de começar a usá-lo, para posicionar na primeira posição.

é só trocar o seu laço para algo como:

while(rs.next()) {  
             Contato contato = new Contato();  
             contato.setNome(rs.getString("nome"));  
             contato.setEmail(rs.getString("email"));  
             contato.setEndereco(rs.getString("endereco"));  
               
             contatos.add(contato);  
} 

[quote=jonasabreu]Olá FerTriPa,

o você precisa chamar o next() do ResultSet antes de começar a usá-lo, para posicionar na primeira posição.

é só trocar o seu laço para algo como:

while(rs.next()) {  
             Contato contato = new Contato();  
             contato.setNome(rs.getString("nome"));  
             contato.setEmail(rs.getString("email"));  
             contato.setEndereco(rs.getString("endereco"));  
               
             contatos.add(contato);  
} 

[/quote]
exato!
foi só trocar o laço de repetição de do…while para while que funcionou :smiley:
obrigado pela ajuda jonas

[]'s

Voce esqueceu de atribuir a valores para a rs

Revise cuidadosamente o seu codigo com o da apostila.