Código instável que pode ter vazamento de ponteiro de arquivo:

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.

Código estável que libera todos os recursos:

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.
    }
}