Bem, nao sabia onde encaixar.
Eu, nao uso finally, salvo rarissimos casos onde quero q o trecho seja executado independente se estou dando catch ou nao numa excecao, em especial as runtimes
e voce?
Eu uso geralmente em partes de manipulacao de arquivos ou banco de dados, quando quero ter certeza que a conexao ou file pointer ficarao perditos… algo como
BufferedReader = null;
try {
// cria reader, processa arquivo e tudomais
}
catch (Exception e) {
// oooops
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (Exception e) {
// outro ooops
}
}
}
O mesmo para conexoes ( mas, como centralizo isso em um unico ponto, nao eh tao constante ).
Rafael
Ueh, Paulo… nao entendi o proposito desse post… vc quer discutir se usar ou nao finally eh uma questao de estilo ou de gosto? Sei lah, parece tao estranho pra mim quanto uma discussao tentando comparar while e for
Dificilmente uso finally…já fiz a bobeira de disparar exceção dentro de um,e descobri(muito tempo depois),q uma exceção q devia ter sido tratada foi perdida…
Eu volta e meia uso finally por ser 1 programador de c++ orfão do pattern de RIIA.
Mas ha alguma razao especial/anti-pattern/sei la pra nao usar finally ?
Rafael
Rafael,pelo pouco de java q eu sei,o único motivo q NÃO se deve usar finally é para disparar(throw) um exceção pelo erro q descrevi acima(q ocorre MESMO!)…alguém conhece outro?Ah,fica mais enjoado de ler tb…
Eu NUNCA uso o finally, até por que eu ainda vou estudar o capítulo de exceções.
(DãÃã :shock: )
Eu geralmente uso finally com os mesmos propositos citados pelo Rafael, liberar recursos do banco ou algo do genero. Só que sempre crio um handler da vida para fazer isso ao inves de colocar os close’s dentro do proprio finally.
Até.
vou me expressar melhor com o codigo do rafael:
BufferedReader = null;
try {
// cria reader, processa arquivo e tudomais
}
catch (Exception e) {
// oooops
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (Exception e) {
// outro ooops
}
}
}
esse codigo acima eh perfeitamente trocavel por:
BufferedReader = null;
try {
// cria reader, processa arquivo e tudomais
}
catch (Exception e) {
// oooops
}
if (reader != null) {
try {
reader.close();
}
catch (Exception e) {
// outro ooops
}
}
isto eh, o finally nao te salvou copies e pastes, nem nada. soh te salvaria no caso do seu catch ser em algumas excecoes, e voce quer que o finally execute mesmo por excecoes que voce nao estava esperando (runtime exceptions ou excecoes que voce declarou que throws). ah, claro, se voce tivesse rethrowado alguma outra exception, ou retornado, o segundo codigo nao era equivalente.
entao passa a ser uma questao de inutilidade em muitos casos, concordam?
Nao eh perfeitamente “trocavel”, Paulo. Se rolar uma runtime exception que o seu catch nao tah pegando, o if nao vai executar, e - advinha soh - teu arquivo nao vai ser fechado.
Outro caso onde eh mto bom usar finally:
public void foo() throws BarException, BazException {
try {
// abre as bagaça
} finally {
// fecha as bagaça
}
}
Inutilidade, nao, mas passa a ser questao de estilo. Um finally deixa muito mais clara a sua intenção de que aquele código DEVE ser executado mesmo que o mundo esteja vindo abaixo
[quote=“cv”]Nao eh perfeitamente “trocavel”, Paulo. Se rolar uma runtime exception que o seu catch nao tah pegando, o if nao vai executar, e - advinha soh - teu arquivo nao vai ser fechado.
[/quote]
cv, foi exatamente isso q falei. eh perfeitamente trocavel, a nao ser que seu codigo lance runtime excetption e vc nao peuge, ou seja uma excecao que voce esteja throwando, ou voce esteja retornando dentro do seu catch. ta logo no post acima!
nao le meus posts direito! mata-lo-ei!
Entao nao eh perfeitamente substituivel, ora bolas! :roll:
[quote=“JBoy__”]Eu NUNCA uso o finally, até por que eu ainda vou estudar o capítulo de exceções.
(DãÃã :shock: )[/quote]
heuheuheuheuhue - tai um bom motivo pra nao usar o finally.
Acho que convem usar o finally soh nos casos para os quais ele foi criado: executar um codigo mesmo que surja uma excecao. Senao, eh mais complicacao pra entender o codigo (ta, digamos que nao muda muita coisa, mas o codigo poderia ser mais simples).
Marcio Kuchma
Muitas vezes, senao em muitas, voce quer propagar o erro, porem sem causar um resource leak, ai o finally cai como uma luva.
Sem falar que ele evita duplicacao de codigo ou aumento do flow control de um bloco
Ae Galera estou Estudando Java A menos de Um Mes e meu Professor
quer um pgm utilizando essa estrutura, so que naum entendi o q ele explicou e to ralando pra entender sozinho e agora so me resta a ajuda de vcs . E eu naum sei Qual a verdadeira utilidade do [color=“orange”][/color]Finally[color="#444444"][/color] , pois o tratamento da exceção é feito no [color=“orange”][/color]Catch[color="#444444"][/color]. Por favor postem Alguns exemplos e de preferência q sejam simples.
Se alguem tiver alguma apostila ou tutorial que possa me ajudar tb serve.
Ae valeu e desulpa por ae pedir tanto…
Um exemplo bem simples: Dentro de uma iteração (loop) você está montando uma string pra cada iteração baseado num punhado de processamento e caso ocorra uma exceção OU vocÊ decida que esse registro não vai gerar a string você precisa limpar o buffer … então coloque a limpeza do buffer no finally. Algo assim:
[code]StringBuffer buffer = new StringBuffer(500);
for(i=0;i<linhas.size();i++) {
try {
//to processando
if(linhas[i].getCodigo==null) {
//nao serve
continue;
}
Integer x = Integer.valueOf(linhas[i].getNumero());
//aqui pode ocorrer uma exceção
//e outras e mais outras
//vai colocando coisas no buffer
} catch(NumberFormatException e) {
//ops
} finally {
//limpa o buffer, seja porque entrou no meu continue
//seja porque ocorreu uma excecao
//seja porque processei tudo mesmo e vou pro proximo passo
}
}[/code]
Esse é um exemplo, mas você geralmente vai usar pra liberar recursos como arquivos e outras coisitas.