Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Finally ou código fora do bloco

Qual a diferença de fazer

try {
  throw new RuntimeException("excecao forcada");
} catch(Exception e) {
  System.out.println("deu erro");
} finally {
  System.out.println("acabou");
}

ou

try {
  throw new RuntimeException("excecao forcada");
} catch(Exception e) {
  System.out.println("deu erro");
}
System.out.println("acabou");

Porque uma é preferível em relação a outra? Agradeço desde já!

4 respostas
solução!

Veja o exemplo abaixo:

public class Testes {

    public static void main(String[] args) {

        comFinally();

        semFinally();

    }

    private static void comFinally(){

        try {

            double teste = 3/0;

        } catch (Exception e) {

            double teste = 3/0;

        }finally{

            System.out.println("imprimiu");

        }

    }

    private static void semFinally(){

        try {

            double teste = 3/0;

        } catch (Exception e) {

            double teste = 3/0;

        }

        System.out.println("imprimiu");

    }

}

com finally sempre é exibido no console "imprimiu", já sem finally...

Com o finally independe de o código ter rodado pelo try ou lançado algum erro pro catch. Esse bloco SEMPRE será executado, após o try/catch.

Isso é legal por exemplo se você estiver trabalhando com o banco de dados. Caso tenha ocorrido algum erro mesmo lançando a exception a conexão é fechada fazendo com que o banco não fique travado esperando a finalização e caso tenha dado tudo certo a conexão é fechado do mesmo jeito.

Isso evita de ter que ficar colocando o método close(); tanto no try quanto no catch já que sempre o finally será chamado ao final de tudo.

Acredito ser uma questão de boas práticas David, visto que como vc citou, o código é executado em ambas as formas (não achei o exemplo do Manuel válido pq ele está gerando uma exceção dentro do catch), por isso fica mais claro e elegante usar dessa estrutura na construção do código.

Por favor, a galera mais experiência, falem sobre esse caso para que possamos aprender mais.

Caso ocorra exceção ou não irá executar o conteúdo do fin.