Boa tarde,
Estou fazendo um exercício e estou recebendo exception de NullPointer, sei o que significa essa exception,
porem procurei, pensei, procurei, pensei mais um pouco e não consegui descobrir o problema.
Tenho uma classe DAO com o seguinte método:
public Livro getLivro(int idp) {
Livro liv = new Livro();
ResultSet rs;
try {
stmtGetLivro = con.prepareStatement("SELECT * FROM livros WHERE id = ?");
stmtGetLivro.clearParameters();
stmtGetLivro.setInt(1, idp);
rs = stmtGetLivro.executeQuery();
liv.setId(rs.getInt("id"));
liv.setTitulo(rs.getString("titulo"));
liv.setAutor(rs.getString("autor"));
liv.setEdicao(rs.getInt("edicao"));
liv.setVersao(rs.getString("versao"));
liv.setSituacao(rs.getString("situacao"));
} catch (SQLException ex) {
Logger.getLogger(LivroDAO.class.getName()).log(Level.SEVERE, null, ex);
}
return liv;
}
E o seguinte método em outra classe chamando o método acima:
private void bBuscarActionPerformed(java.awt.event.ActionEvent evt) {
int idbusca = -1;
bSituacao.setEnabled(true);
bNovo.setEnabled(false);
bSalvar.setEnabled(true);
bExcluir.setEnabled(true);
bCancelar.setEnabled(true);
idbusca = Integer.parseInt(tfId.getText());
l = dao.getLivro(idbusca);
tfTitulo.setText(l.getTitulo());
tfAutor.setText(l.getAutor());
tfEdicao.setText(String.valueOf(l.getEdicao()));
tfVersao.setText(l.getVersao());
}
O idp está sendo passado corretamente na Statement, já verifiquei isso, mas mesmo assim continua a exception que esta sendo disparada
nesta linha:
stmtGetLivro = con.prepareStatement("SELECT * FROM livros WHERE id = ?");
Agradeço qualquer luz,
Felipe
Você primeiro precisa inicializar a variável con.
Vc vai ter q jogar mais código aqui para analisar…
Provavelmente é o seu objeto ‘con’ que está com problemas… talvez não está sendo instanciado corretamente…
Abraços
Primeiramente, muito obrigado pela resposta
Estou inicializando a variavel ja no construtor da classe, esqueci de postar essa parte do código.
public class LivroDAO implements ILivroDAO{
private Connection con;
...
public void LivroDAO() {
con = Conexao.getConnection();
}
Classe Conexao:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Conexao {
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("com:jdbc:mysql://127.0.0.1/livro", "root", "");
} catch (ClassNotFoundException ex) {
Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
}
return conn;
}
}
Alguma outra idéia?
apos vc invocar o metodo executequery, vc deve posicionar o resultset…
ex:
rs = stmtGetLivro.executeQuery();
rs.next();
//rs.get....
ou senao colocar ele em um laço…
rs = stmtGetLivro.executeQuery();
while(rs.next())
//rs.get....
abraco
resumindo, isso é um NullPointerException:
Classe qqcoisa = null;
qqcoisa.metodoNaoEstatico();
Para evitar…
Classe qqcoisa = new MeuConstrutorPreferido(pa,ra,me,tros);
qqcoisa.metodoNaoEstatico();
O motivo disso é, basicamente, que o metodoNaoEstatico PODE se utilizar do estado do objeto para efetuar o seu trabalho e, se a referência é nula, não tem objeto, logo não tem estado.
Se o metodo do exemplo trocasse algum valor de algum atributo interno do objeto, isso não seria possivel pelo motivo explicado.
Uma Exception é seguida de um StackTrace, que diz aonde ele aconteceu, isso costuma ser muito elucidativo. Procure ler e interpretar as Exceptions e suas StackTraces pois isso é informação que, normalmente, te ajuda a identificar rapidamente o problema.
Perceba que fazer isso
Classe qqcoisa = outraCoisa.outroProcedimento();
if(qqcoisa != null){
qqcoisa.metodoNaoEstatico();
}
É tentador, porém não abuse, dá cheiro ruim no código, que vc pode evitar de muitas formas
Pessoal,
Como tinha falado:
"Estou inicializando a variavel ja no construtor da classe, esqueci de postar essa parte do código. "
Porém o que eu não vi, e ninguém percebeu também, é que coloquei void no construtor :oops:
Por isso nao estava sendo executado na instanciação.
Obrigado a todos pela atenção,
Felipe