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

Utilidade do finaly no try/catch

Sendo o finaly para força que uma coisa sempre ocorra, por que não apenas colocar essa coisa fora do try/catch?

Após o tratamento ela seria executada normalmente, mesmo sem o finaly.

Um exemplo foi a impressão dos trechos nos exercícios que diziam "fim método2". Ele executa mesmo sem o finaly tanto em caso de sucesso quanto em caso de problema.

7 respostas

Elias,

O finally só garante que algo ocorra, isso é boa pratica colocar quando vc quer ter certeza que o código seja executado independente do que ocorra.

Caso vc lance uma exceção no catch ou simplesmente de um return, o código dali pra baixo não será executado, nestes casos, o finally garante que o código será executado, um exemplo é uma conexão aberta.

Entendo, mas, é só eu deixar pra dar return despois das instruções.

Como nos exemplos que eu citei, mesmo tendo exceção, os textos de final de método foram exibidos.

Estou falando deste exemplo.

public class TesteErro { public static void main(String[] args) { System.out.println("inicio do main"); try { metodo1(); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Erro : " + e); } System.out.println("fim do main"); }

static void metodo1() { System.out.println("inicio do metodo1"); metodo2(); System.out.println("fim do metodo1"); }

static void metodo2() { System.out.println("inicio do metodo2"); int[] array = new int[10]; for (int i = 0; i <= 15; i++) { array[i] = i; System.out.println(i); } System.out.println("fim do metodo2"); }

Boa noite, Elias! Como vai?

Para responder a sua pergunta, vamos dar uma olhada nesse código aqui:

try {
     metodo1();
     System.out.println("try");
     return;
} catch (Exception e) {
     System.out.println("catch");
}

System.out.println("finally");

A palavra "finally" será impressa ou não? A resposta é depende! Se o metodo1() não lançar uma Exception o return será executado e o "finally" não será impresso. Portanto, nesse caso, "finally" só aparecerá caso ocorra uma Exception na execução do metodo1(). Agora, imagine se "finally" representasse a liberação de um recurso mto custoso! Vc ficaria refém de ocorrer ou não a Exception para liberar esse recurso e isso é péssimo!

É por esse motivo que o bloco finally se faz necessário! Inclusive a documentação do Java ressalta a sua utilidade quando diz:

The finally block always executes when the try block exits. This ensures that the finally block is executed even if an unexpected exception occurs. But finally is useful for more than just exception handling — it allows the programmer to avoid having cleanup code accidentally bypassed by a return, continue, or break. Putting cleanup code in a finally block is always a good practice, even when no exceptions are anticipated.

Ou seja, colocar código de finalização dentro do bloco finally é uma boa prática pq torna o nosso código mais seguro!

Extra: Desde o Java 7 há uma nova forma de utilizar o try, chamada try-with-resources. Na página do link que coloquei aqui no meu comentário há um outro link levando para a documentação da Oracle sobre o try-with-resources. Dê uma passada lá e aproveite para conhecer esse recurso caso ainda não o conheça!

Grande abraço e bons estudos!

Entendo o que você quer dizer, mas, se eu escrever o código assim:

try {
     metodo1();
     System.out.println("try");
} catch (Exception e) {
     System.out.println("catch");
}
System.out.println("finally");
return;

A palavra "finally" seria sempre impressa, ou estou enganado?

solução!

Sim, Elias, vc está correto! No entanto, repare que a situação descrita por mim é diferente, pois no meu caso só queremos dar return caso tudo ocorra com sucesso e no seu caso, vc está dando return tanto em caso de sucesso como em caso erro.

Além disso, imagina que amanhã ou depois, alguém tire esse return e passe ele pra dentro do bloco try por algum motivo qualquer. Seu código passa a ficar refém da Exception como eu descrevi na minha resposta! Sendo que se vc tivesse seguido a boa prática de criar o bloco finally isso não teria acontecido!

Outra coisa, o bloco finally tbm é bom pq ele é um bloco diferenciado dentro do seu código! Se eu quero procurar exatamente onde vc está fechando seus recursos eu já sei onde procurar e vou direto nesse bloco e não preciso ficar procurando em outras partes de um código grande e mtas vezes complexo.

Conseguiu pegar a ideia?

Sim, muito obrigado pela atenção!

Por nada, Elias!

Sempre que tiver qualquer dúvida é só procurar o pessoal aqui no fórum!

Grande abraço e bons estudos!