Sobes.tech
Junior

Onde na manipulação de exceções pode ser usada a construção com finally?

sobes.tech IA

Resposta da IA

A construção finally é usada para executar um código que deve ser executado independentemente de uma exceção ter sido lançada e se ela foi capturada. Isso garante a liberação de recursos ou a execução de outras ações obrigatórias.

Cenários típicos de uso de finally:

  • Fechar recursos: Liberar ficheiros, ligações de rede, ligações a bases de dados, etc., que foram abertos no bloco try.

    // Fechar ficheiro
    FileInputStream fis = null;
    try {
        fis = new FileInputStream("myfile.txt");
        // Leitura do ficheiro
    } catch (FileNotFoundException e) {
        // Tratamento da exceção
    } finally {
        if (fis != null) {
            try {
                fis.close(); // Fecho garantido do fluxo
            } catch (IOException e) {
                // Tratamento da exceção ao fechar
            }
        }
    }
    
  • Restaurar o estado: Reverter alterações ou devolver o sistema ao seu estado original após uma operação potencialmente mal-sucedida.

  • Registo: Registar informações sobre a execução da operação, mesmo que uma exceção tenha ocorrido.

  • Libertar bloqueios: Remover bloqueios adquiridos no bloco try.

É importante lembrar que o código em finally será executado mesmo que no bloco try ou catch haja uma saída do método (usando return, break ou continue) ou uma nova exceção seja lançada. No entanto, se o programa terminar devido a uma chamada a System.exit() ou a um erro grave do sistema (por exemplo, OutOfMemoryError), o bloco finally pode não ser executado.

Nas versões modernas do Java (a partir do Java 7), para fechar recursos automaticamente, é preferível usar a construção try-with-resources, que é uma forma mais limpa e segura de gerir recursos.

// Uso de try-with-resources
try (FileInputStream fis = new FileInputStream("myfile.txt")) {
    // Leitura do ficheiro
} catch (IOException e) { // Captura FileNotFoundException, herdada de IOException
    // Tratamento da exceção
} // O recurso fis será fechado automaticamente