Quando vejo um código nesse padrão:
InputStream is = getSomeInputStream();
try {
// use 'is'
} catch(IOException ex) {
// log ex
} finally {
try {
if (is != null) is.close();
} catch(IOException ex) {}
}
Me dá náusea, vertigem, urticária! Comparem com este padrão:
try {
final InputStream is = getSomeInputStream(); // se der exception vai lá pro catch
// sem passar pelo finally
try {
// use 'is' // se der exception vai lá pro catch
// passando pelo finally
} finally {
is.close(); // certeza de que 'is' não é null
}
} catch(IOException ex) {
// log ex
}
Ele espelha a keyword ‘using’ do C#, só loga a exception uma vez e garante que ‘is’ é diferente de null no bloco ‘finally’ (e caso o close dispare uma exception, tem o catch logo abaixo).
Críticas?