Olá pessoal… estou utilizando jdbc em algumas classes que eu estou utilizando atraves da apostila fj-21 da caelum que eu estou estudando… no exemplo eles pedem pra recuperar um contato qualquer através de id … eu consegui fazer o código pra retornar e talz… mas só consigo retornar ele se passar um argumento do tipo contato para o método… algo mais ou menos assim…
Código que Funciona
Classe ContatoDAO
public Contato mostrarUmContatoPorID(Contato contato) throws SQLException {
PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
stm.setInt(1, contato.getId());
ResultSet rs = stm.executeQuery();
while (rs.next()) {
contato.setNome(rs.getString("nome"));
contato.setEndereco(rs.getString("endereco"));
contato.setEmail(rs.getString("email"));
Calendar data = Calendar.getInstance();
data.setTime(rs.getDate("datanasc"));
contato.setDataNasc(data);
}
rs.close();
stm.close();
return contato;
}
Classe Executável
[code]
public static void main(String[] args) throws SQLException {
Contato contato = new Contato();
Scanner sc = new Scanner(System.in);
System.out.print("Digite o id para pesquisar.:");
contato.setId(sc.nextInt());
new ContatoDAO().mostrarUmContatoPorID(contato);
System.out.println("ID Selecionada.: "+contato.getId());
System.out.println("Nome.: "+contato.getNome());
System.out.println("Endereço.: "+contato.getEmail());
System.out.println("E-mail.: "+contato.getEmail());
System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");
}[/code]
Entao… eu gostaria de passar um argumento para o método mostrarUmContato aonde o argumento passado fosse um valor inteiro e nao do tipo Contato… tentei fazer dessa forma mas me gera um NullPointerException…
Código que não funciona
Classe ContatoDAO
public Contato mostrarUmContatoPorID(int id) throws SQLException {
Contato contato = new Contato();
PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
stm.setInt(1, contato.getId());
ResultSet rs = stm.executeQuery();
while (rs.next()) {
contato.setNome(rs.getString("nome"));
contato.setEndereco(rs.getString("endereco"));
contato.setEmail(rs.getString("email"));
Calendar data = Calendar.getInstance();
data.setTime(rs.getDate("datanasc"));
contato.setDataNasc(data);
}
rs.close();
stm.close();
return contato;
}
Classe Executavel
public static void main(String[] args) throws SQLException {
Contato contato = new Contato();
Scanner sc = new Scanner(System.in);
System.out.print("Digite o id para pesquisar.:");
contato.setId(sc.nextInt());
new ContatoDAO().mostrarUmContatoPorID(contato.getId());
System.out.println("ID Selecionada.: "+contato.getId());
System.out.println("Nome.: "+contato.getNome());
System.out.println("Endereço.: "+contato.getEndereco());
System.out.println("E-mail.: "+contato.getEmail());
System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");
}
Qual o erro??? Acho que ele esta pegando o valor de mais de um objeto por isso ele esta dando este erro… ao meu ver… desde já agradeço as explicações!
O erro está na linha 5 da classe ContatoDAO que não funciona.
[code]# public Contato mostrarUmContatoPorID(int id) throws SQLException {
Contato contato = new Contato();
PreparedStatement stm = c.prepareStatement(“select * from contatos where id=?”);
stm.setInt(1, contato.getId()); [/code]
Você passa o inteiro como argumento mas não o passa como parâmetro para o setInt, você usa o contato vazio que acabou de instanciar.
Faça stm.setInt(1, id); e deve funcionar.
[quote=henriquejhc][quote=J-Chist][quote=henriquejhc]Olá. De uma verificada mas acho que o id do contato é um long.
Aqui você está passando um long:
[/quote]
Está???
[/quote]
Sim. Se você ver na apostila verá que o id da classe Contato é um long.[/quote]
Ah, tá. Eu não tenho a apostila. De qualquer forma, esse problema do nosso amigo aqui é a linha 5. Se ele passar um long para o setInt vai tomar um erro de incompatibilidade de parâmetros.
Como no código que funciona ele também está usando o setInt…
public static void main(String[] args) throws SQLException {
Contato contato = new Contato();
Scanner sc = new Scanner(System.in);
System.out.print("Digite o id para pesquisar.:");
contato.setId(sc.nextInt()); // aqui ele está setando o id
new ContatoDAO().mostrarUmContatoPorID(contato.getId()); // está passando um long
System.out.println("ID Selecionada.: "+contato.getId());
System.out.println("Nome.: "+contato.getNome());
System.out.println("Endereço.: "+contato.getEndereco());
System.out.println("E-mail.: "+contato.getEmail());
System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");
}
[quote=henriquejhc][code]
public static void main(String[] args) throws SQLException {
Contato contato = new Contato();
Scanner sc = new Scanner(System.in);
System.out.print("Digite o id para pesquisar.:");
contato.setId(sc.nextInt()); // aqui ele está setando o id
new ContatoDAO().mostrarUmContatoPorID(contato.getId()); // está passando um long
System.out.println("ID Selecionada.: "+contato.getId());
System.out.println("Nome.: "+contato.getNome());
System.out.println("Endereço.: "+contato.getEndereco());
System.out.println("E-mail.: "+contato.getEmail());
System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");
}
[/code][/quote]
A partir da apostila se pode pressumir isso. Como ele não postou a classe Contato que fez, não podemos fazer tal afirmação.
obrigado J-Chist e henriquejhc… realmente na apostila está sendo passado um valor do tipo long… mas eu mudei um pouco essa programação pra não ficar tao igual a da apostila, por isso estou passando como valor um tipo int … vou testar o código agora… assim que resolver eu mudo o tópico para editado… e obrigado pela ajuda… eu realmente não conseguia mais enxergar o erro huhuhuhu… mas eu tinha certeza que o erro era nesse objeto que eu tinha instanciado (só isso explicava o não apontar pra lugar nenhum!!!). Obrigado pela ajuda…
olá… testei o código agora… continua dando NullPointerException … o código ficou dessa forma
[code]
public Contato mostrarUmContatoPorID(int id) throws SQLException {
Contato contato = new Contato();
PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
stm.setInt(1, id);
ResultSet rs = stm.executeQuery();
while (rs.next()) {
contato.setNome(rs.getString("nome"));
contato.setEndereco(rs.getString("endereco"));
contato.setEmail(rs.getString("email"));
Calendar data = Calendar.getInstance();
data.setTime(rs.getDate("datanasc"));
contato.setDataNasc(data);
}
rs.close();
stm.close();
return contato;
}
}[/code]
Classe Principal
[code]
public static void main(String[] args) throws SQLException {
Contato contato = new Contato();
Scanner sc = new Scanner(System.in);
System.out.print("Digite o id para pesquisar.:");
contato.setId(sc.nextInt());
new ContatoDAO().mostrarUmContatoPorID(contato.getId());
System.out.println("ID Selecionada.: "+contato.getId());
System.out.println("Nome.: "+contato.getNome());
System.out.println("Endereço.: "+contato.getEndereco());
System.out.println("E-mail.: "+contato.getEmail());
System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");
}[/code]
Agora está funcionando… mudei o argumento de int para long e agora está funcionando normalmente… mas precisei declarar uma variável long na classe Principal para poder exibir corretamente o valor digitado, pq deixando só contato = new ContatoDAO().mostrarUmContatoPorID(contato.getID()) exibia na saída somente zero independente do valor digitado! o código final ficou assim :
ContatoDAO
[code]
public Contato mostrarUmContatoPorID(long id) throws SQLException {
Contato contato = new Contato();
PreparedStatement stm = c.prepareStatement("select * from contatos where id=?");
stm.setLong(1,id);
ResultSet rs = stm.executeQuery();
while (rs.next()) {
contato.setNome(rs.getString("nome"));
contato.setEndereco(rs.getString("endereco"));
contato.setEmail(rs.getString("email"));
Calendar data = Calendar.getInstance();
data.setTime(rs.getDate("datanasc"));
contato.setDataNasc(data);
}
rs.close();
stm.close();
return contato;
}
}[/code]
Principal
[code]
public static void main(String[] args) throws SQLException {
Contato contato = new Contato();
Scanner sc = new Scanner(System.in);
System.out.print("Digite o id para pesquisar.:");
contato.setId(sc.nextInt());
long valor = contato.getId();
contato = new ContatoDAO().mostrarUmContatoPorID(valor);
System.out.println("ID Selecionada.: "+valor);
System.out.println("Nome.: "+contato.getNome());
System.out.println("Endereço.: "+contato.getEndereco());
System.out.println("E-mail.: "+contato.getEmail());
System.out.println("Data.: "+contato.getDataNasc().getTime()+"\n");
}[/code]