Boa tarde a todos, primeiramente me desculpe se o titulo não deixou muito claro, não consegui pensar em algo melhor. Agora a minha dúvida:
Suponha a seguinte classe:
MinhaClasse.javapublic class MinhaClasse extends Pesquisa {
public MinhaClasse() {
super();
}
public List<Banco> consulta() throws SQLException {
List<Banco> lista = new ArrayList<Banco>();
sql = "select * from banco";
try {
connection = new ConnectionFactory().getConnection();
stmt = connection.prepareStatement(sql); // suponhamos que aqui ele
// lance alguma excessão
rs = stmt.executeQuery();
while (rs.next()) {
Banco banco = new Banco();
lista.add(banco);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
rs.close();
stmt.close();
connection.close();
}
return lista;
}
public static void main(String[] args) throws SQLException {
MinhaClasse m = new MinhaClasse();
m.consulta();
}
}
abstract class Pesquisa {
protected PreparedStatement stmt;
protected String sql;
protected Connection connection;
protected ResultSet rs;
public Pesquisa() {
connection = new ConnectionFactory().getConnection();
}
}
Pois bem, se no lugar que eu coloquei o primeiro comentário lançar uma SQLException ele cairá no catch e passar para o finally. Até ai tudo bem, o problema é que se ele lançar uma Exception ali (ou algum lugar antes) ele lançará uma NullPointerException ao tentar invocar o metodo close() já que a variável rs estará apontando para null (já que não foi inicializada por um codigo meu mas sim pelo construtor padrão da classe). Como eu não posso instanciar um objeto do tipo ResultSet não consigo pensar em uma solução para esse problema.
Eu pensei em por um try-catch no finally mas não ficaria elegante. A única forma que eu encontrei seria apagar a classe Pesquisa e refazer todas as classes que herdam dela, transformando rs, stmt, connection e sql em variaveis de escopo.
Existe alguma forma de resolver o meu problema sem ter de usar um try-catch no finally e mantendo a minha classe Pesquisa? Caso não, qual das duas alternativas seria a melhor?