try {
entrada = new FileInputStream(
arquivoDeEntrada);
saida = new FileOutputStream(
arquivoDeSaida);
} finally {
try {
entrada.close();
saida.close();
} catch(IOException e) {
// Não há o que fazer.
}
}
Se os streams não são fechados, o sistema operacional hospedeiro não consegue liberar os recursos nativos. Este programador quer ser cuidadoso fechando os dois streams. Então ele chama o método close no bloco finally. Mas se entrada.close lança uma IOException então saida.close nunca será executado. Cada método close deve ser chamado no seu próprio bloco try/catch. Além disso, se a criação do stream entrada lançar uma exceção (porque o arquivo não foi encontrado) então saida será null e saida.close irá lançar uma NullPointerException.
try {
entrada = new FileInputStream(
arquivoDeEntrada);
saida = new FileOutputStream(
arquivoDeSaida);
} finally {
try {
if (entrada != null)
entrada.close();
} catch(IOException e) {
// Não há o que fazer.
}
try {
if (saida != null)
saida.close();
} catch(IOException e) {
// Não há o que fazer.
}
}