como usar finalmente

Eu nunca entendi corretamente o uso da declaração final. Alguém pode me dizer qual é a diferença entre:

try { a; block; off; statements; } catch (Exception e) { handle; exception; e; } finally { do; some; cleanup; } 

por um lado e:

 try { a; block; off; statements; } catch (Exception e) { handle; exception; e; } do; some; cleanup; 

No outro

Eles diferem se

  • o try -block é executado lançando um java.lang.Throwable que não é java.lang.Exception , por exemplo, porque é um java.lang.Error , como AssertionError ou OutOfMemoryError .
  • o bloco try completa abruptamente usando uma instrução de stream de controle como continue , break ou return
  • o catch-block é completado abruptamente (jogando qualquer throwable ou usando uma instrução de stream de controle)

Mais geralmente, a linguagem java garante que um bloco finally seja executado antes que a instrução try seja concluída. (Observe que, se a instrução try não for concluída, não há garantia sobre o finally. Uma instrução pode não ser concluída por vários motivos, incluindo desligamento de hardware, encerramento do sistema operacional, desligamento de VM (por exemplo, devido a System.exit ) o encadeamento aguardando ( Thread.suspend() , synchronized , Object.wait() , Thread.sleep() ) ou ocupado de outra forma (loops sem fim, ,,,).

Portanto, um bloco finally é um lugar melhor para ações de limpeza do que o final do corpo do método, mas, por si só, ainda não pode garantir a execução da limpeza.

finally bloco executa sempre.

finally block é usado para limpeza, como para liberar resources usados ​​dentro de try / catch , conexões de db de fechamento, sockets de fechamento, etc. mesmo quando uma exceção não tratada ocorre dentro de seu bloco try / catch .

A única vez que o bloco finally não é executado é quando system.exit() é chamado em try / catch ou ocorre algum erro em vez de uma exceção.

O erro na descrição acima significa quando o aplicativo Java sai com condições como Erro de falta de memory. Eu vejo alguns downvotes 🙁 por esse motivo parece.

A principal diferença é que a seção catch pode lançar uma exceção, sair de um bloco adjacente ou retornar do método atual. Nesse caso, do; some; cleanup; do; some; cleanup; não é executado.

Com um bloco finally , é garantido que esse código será executado.

É basicamente uma má idéia pegar todas as exceções – então você precisa considerar o que acontecerá se uma exceção não capturada se propaga do seu try / catch ou try / catch / finally block. Finalmente, os blocos permitem que você limpe a saída.

Além disso:

  • O bloco catch pode lançar uma exceção
  • Você pode querer retornar do bloco try

Em suma, se você quer que algum código seja executado quando você deixa o bloco try / catch, mas você o está deixando (além do processo ser encerrado com muita dificuldade), finalmente é seu amigo.

Em um estilo de codificação apropriado, você não quer pegar tudo como abaixo.

 try{ [some task] } catch { } 

O que você gostaria de fazer é pegar erros conhecidos específicos.

 try{ [some task] } catch(Exception ex) { if([known execption]) [ignore] else throw(ex); } [Cleanup] 

Nesse caso, seu código de limpeza não será executado no caso de um erro ser lançado novamente. Então nós adicionamos finalmente o que será executado mesmo se um novo erro for lançado.

 try{ [some task] } catch(Exception ex) { if([known execption]) [ignore] else throw(ex); } finally { [Cleanup] } 

O bloco “finalmente” será sempre executado.

Em seu segundo exemplo, a limpeza não ocorreria se o bloco catch repetisse a exceção ou se uma exceção não identificada ocorresse no bloco try.

A partir deste fórum no GeekInterview:

O bloco finally sempre é executado quando o bloco try é encerrado. Isso garante que o bloco finally seja executado, mesmo que ocorra uma exceção inesperada. Mas, finalmente, é útil para mais do que apenas o tratamento de exceções – ele permite que o programador evite que o código de limpeza seja ignorado acidentalmente por um retorno, continuar ou interromper. Colocar o código de limpeza em um bloco finally é sempre uma boa prática, mesmo quando nenhuma exceção é esperada.

Simplesmente uma linha de explicação:

Independentemente se você pegou uma exceção ou não, os códigos no bloco finally serão executados.

A diferença entre as duas partes que você deu aqui é: os códigos na peça sem usar finally nunca serão executados.

para entender corretamente, finally , tudo que você precisa saber é que finally = garantia!

você pode usá-lo para limpar, para ajudar com a facilidade de uso ou para repetir algo

No primeiro exemplo, o bloco finally sempre é executado mesmo se você tiver uma instrução de retorno na cláusula try. A única vez que não é executada é quando você tem System.exit (0).