Caelum fj-21 - Capítulo 2 - ContatoDAO

9 respostas
F

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

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

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

9 Respostas

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!

O

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

F

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!</blockquote>

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)
fmad27

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

F

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

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

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


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

[]'s

A

Voce esqueceu de atribuir a valores para a rs

peczenyj

Revise cuidadosamente o seu codigo com o da apostila.

Criado 19 de março de 2009
Ultima resposta 20 de mar. de 2009
Respostas 9
Participantes 6