A palavra-chave finally em Java é usada em conjunto com blocos try e catch para garantir que um bloco de código específico seja sempre executado, independentemente de ocorrer ou não uma exceção. O bloco finally é geralmente usado para liberar recursos ou realizar limpeza, como fechar conexões de banco de dados, arquivos, etc.
Estrutura do try-catch-finally
try {
// Código que pode gerar exceção
} catch (ExceptionType e) {
// Código para lidar com a exceção
} finally {
// Código que sempre será executado, independentemente da ocorrência de exceção
}
Exemplo 1: Uso básico do finally
public class ExemploFinally {
public static void main(String[] args) {
try {
int[] numeros = {1, 2, 3};
System.out.println(numeros[3]); // Gera ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Exceção capturada: " + e);
} finally {
System.out.println("Bloco finally sempre executado.");
}
}
}
Saída:
Exceção capturada: java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
Bloco finally sempre executado.
Explicação:
- O bloco
finallyé executado mesmo após a ocorrência de uma exceção no blocotry.
Exemplo 2: finally sem exceção
public class ExemploSemExcecao {
public static void main(String[] args) {
try {
int a = 10;
int b = 5;
int resultado = a / b;
System.out.println("Resultado: " + resultado);
} catch (ArithmeticException e) {
System.out.println("Exceção capturada: " + e);
} finally {
System.out.println("Bloco finally sempre executado.");
}
}
}
Saída:
Resultado: 2
Bloco finally sempre executado.
Explicação:
- O código no bloco
trynão lança uma exceção, mas o blocofinallyé executado de qualquer maneira.
Exemplo 3: Uso com retorno no try e catch
Mesmo que o bloco try ou catch tenha uma instrução return, o bloco finally será executado antes do retorno do método.
public class ExemploComReturn {
public static int dividir(int a, int b) {
try {
return a / b;
} catch (ArithmeticException e) {
System.out.println("Exceção capturada: " + e);
return 0;
} finally {
System.out.println("Bloco finally sempre executado.");
}
}
public static void main(String[] args) {
System.out.println(dividir(10, 0));
}
}
Saída:
Exceção capturada: java.lang.ArithmeticException: / by zero
Bloco finally sempre executado.
0
Explicação:
- Mesmo com o
returnno blococatch, o blocofinallyainda é executado antes de o método retornar o valor.
Uso Comum do finally
O bloco finally é frequentemente usado para garantir que recursos como streams de arquivos ou conexões de banco de dados sejam fechados adequadamente.
try {
// Abrir recurso (ex: arquivo, conexão de banco de dados)
} catch (Exception e) {
// Lidar com exceção
} finally {
// Fechar o recurso, independentemente de sucesso ou falha
}
Resumo:
- O bloco
finallyé opcional, mas garante que o código seja executado mesmo se ocorrer uma exceção. - É útil para liberar recursos como arquivos, conexões de banco de dados, etc.
- Mesmo se houver um
returnemtryoucatch, ofinallyserá executado antes do retorno do método.
O uso do finally é uma boa prática para garantir que a limpeza necessária seja feita em um programa, independentemente de erros.
