Erro com try/catch/finnaly

11 respostas
Rubem_Azenha

eu sempre pensei que isso dava certo…

//tenta ler esse ultimo arquivo
        try
        { ContatoReader cr = new ContatoReader(ap.getLastFile());
           agenda = cr.getMap();
           
            }//try
        catch(Exception e)//se não conseguir, cria a agenda
        {   agenda = new HashMap(40, 40);
            }//catch
        finally
        { cr.finalize();
            }

mas ta dando esse erro:

Error(65,11): variable cr not found in class mypackage1.Agenda

alguem pode me explicar qual o problema?

11 Respostas

kuchma

Voce declarou a variavel cr dentro do try. Por isso ela nao eh visivel dentro do finally. Declare-a fora do try, deixando apenas para inicializa-la dentro do try. Ai vai rolar.

Marcio Kuchma

Rubem_Azenha

eu sobrescrevi o metodo finalize…
mas ok… declarei antes do try…

valeu ae…

aborges

Nonono… Seu cr ta declarado dentro do TRY mesmo…

ContatoReader cr = new ContatoReader(ap.getLastFile());

Try, catch e finally tem contextos diferentes, portanto, uma variavel declarada DETRO de um deles nao sera VISTA pelo outro!

Rubem_Azenha

mas e pra eu liberar o objeto com finalise?
se lançar exceção na hora de pegar o ultimo arquivo, o objedo não será liberado

aborges

Bem... O finalize e executato automaticamente pelo GC quando seu objeto vai pras pita ;)

Mesmo assim, se vc quiser forcar o finalize declare seu ContatoReader fora do try:

ContatoReader cr=null;
try{...

...

}finally{
   if(cr!=null)
      cr.finalize();
}
Rubem_Azenha
aborges:
Bem... O finalize e executato automaticamente pelo GC quando seu objeto vai pras pita ;)

Mesmo assim, se vc quiser forcar o finalize declare seu ContatoReader fora do try:

ContatoReader cr=null;
try{...

...

}finally{
   if(cr!=null)
      cr.finalize();
}

no caso eu sobrescrevi o finalize fechandos todas as conexões de arquivo e botando null...

kuchma

Soh pra constar: isso nao eh seguro. Nao eh garantido que a VM va executar o finalize() - nao confie nele se voce precisa realizar coisas que nao podem falhar (acho que fechar arquivos eh um desses casos :D).

Marcio Kuchma

Rubem_Azenha

mas eu sobrescrevi o metodo…
isso não tornaria o metodo “executavel” a qq momento?

caiofilipini

microfilo:
mas eu sobrescrevi o metodo…
isso não tornaria o metodo “executavel” a qq momento?

Sim. Mas você tá executando ele na mão, certo? A idéia do finalize() é que ele deve ser chamado automaticamente quando o GC vai limar seu objeto da memória. O que o kuchma disse é que isso não é garantido. No seu caso, tudo bem, você faz a chamada na mão.

caiofilipini

Mais detalhes:

:arrow: http://www.hwn.com.br/pej/tij2pej/TIJ306.htm#_Toc24775607

[]'s

kuchma

uehueheuheue - sim, esqueci desse detalhe. :smiley:

Agora me veio outra coisa na cabeca: considerando que o finalize() eh chamado uma e apenas uma vez pela VM sera que a execucao manual dele influencia alguma coisa nisso na hora do GC? Ou a VM diferencia chamadas dela das dos outros?

[Depois de tres minutos] Pois eh - testei aqui e realmente posso chamar o finalize() diversas vezes. Acho que a VM faz essa distincao na boa.

Em todo caso microfilo, se voce nao tem nenhuma necessidade especial com relacao ao nome do metodo acho que seria uma Boa Coisa™ renomea-lo. :smiley:

Marcio Kuchma

Criado 27 de novembro de 2004
Ultima resposta 30 de nov. de 2004
Respostas 11
Participantes 4