Dúvida em classe para executar update

Buenas!
Tenho uma classe que deveria atualizar registros no banco de dados (PostgreSQL) composto de uma tabela com Nome, Email, Endereço. Esta classe instancia um objeto Contato, contendo Nome, Email, Endereço, um objeto Scanner para identificar qual o registro que deve ser alterado e um objeto ContatoDAO, que chama o método que faz o update.

[code]
import java.util.Scanner;
import java.sql.*;
import modelo.Contato;

public class TestAtualiza {

public static void main (String[] args) throws SQLException {
	
	Contato cont = new Contato();
	Scanner tec = new Scanner(System.in);
	System.out.println("Valores para alterar");
	cont.setNome(tec.next());
	ContatoDAO dao = new ContatoDAO();
	dao.altera(cont);
	System.out.println("Alteração feita");
}

}[/code]

Este é o código da classe na última vez que tentei fazê-la funcionar. Anteriormente, havia tentado setar também email e endereço. No caso, entrava-se com os 3 valores do registro, mas o erro era o mesmo.

Exception in thread "main" org.postgresql.util.PSQLException: Nenhum valor especificado para parâmetro 4.
	at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:150)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:179)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:354)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:347)
	at dao.ContatoDAO.altera(ContatoDAO.java:55)
	at dao.TestAtualiza.main(TestAtualiza.java:16)

O curioso é que não há um parâmetro 4 na definição de Contato. Enfim, abaixo vai o código do método “altera” e a definição de Contato. Deve ser algo bem simples que estou deixando passar, mas minha mente já não funciona mais por hoje. :lol: Saudações!

[code]
public void altera (Contato cont) throws SQLException {

	PreparedStatement stmt = conn.prepareStatement("update contatos set nome=?, email=?, endereco=? where nome=?");
	stmt.setString(1, cont.getNome());
	stmt.setString(2, cont.getEmail());
	stmt.setString(3, cont.getEndereco());
	stmt.execute();
	stmt.close();
}[/code]

[code]
public class Contato {

private String nome;
private String email;
private String endereco;[/code]

Peço excusas pelo post gigantesco, é que tentei colocar o máximo possível de informações. :lol:

o parâmetro 4 que o compilador se refere é o 4° símbolo “?”, você esqueceu logo do parâmetro do where :shock: , tente colocar o código assim:

[code] public void altera (Contato cont) throws SQLException {

	PreparedStatement stmt = conn.prepareStatement("update contatos set nome=?, email=?, endereco=? where nome=?");
	stmt.setString(1, cont.getNome());
	stmt.setString(2, cont.getEmail());
	stmt.setString(3, cont.getEndereco());
            //adicionei esta linha abaixo
	stmt.setString(4, cont.getNome());
	stmt.execute();
	stmt.close();
}[/code]

Assim deve funcionar…

só uma coisa: coloca um id na sua classe contato ou então passa mais um parametro para o metodo ContatoDAO.altera(),por exemplo altera(Contato contato, String nome), porque do jeito que esta vc nunca vai conseguir mudar o nome.