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
try
nã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
return
no blococatch
, o blocofinally
ainda é 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
return
emtry
oucatch
, ofinally
será 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.