Finally

Tenho duas dúvidas. :XD:

Primeira: De que me serve o finally? Eu não poderia simplesmente lançar o código destinado ao bloco finally logo após o try/catch?

try { meuMetodo(); } catch(Exception ex) { System.out.println("fuck!"); } //aqui qualquer coisa que seria inserida no bloco finally

Segunda: Não consigo entender o seguinte trecho:

Alguém consegue pensar em um exemplo facinho (sou leigo hehe) pra ilustrar?

Caro cake,

O finally diz que o trecho de codigo deve ser executado, mesmo que ocorra algum erro, ou corra tude bem.

um exemplo, seria a abertura de um arquivo, se voce coloca todo o codigo no finally, e o arquivo não é encontrado, voce terá um erro, ou seja, voce deve tentar abrir o arquivo dentro do try, caso ocorra um erro, o catch tratara, e o finally será executado para fechar o file que voce tentou abrir, simples se o arquivo for aberto o finally terá o codigo para fechar, se ocorrer um erro durante a abertura o finally tambem fechará

1 curtida
  1. Finally serve para tratar algo que você precisa obrigatoriamente fazer, mesmo que houver um erro.
    O exemplo clássico é quando você quer abrir um arquivo ou uma conexão ao banco de dados que deve ser fechada quando você acabar de usá-la, mesmo que houver um erro (por exemplo, um erro de leitura do arquivo).
  2. De fato, o finally é tão rigoroso nesse sentido que sempre será executado - mesmo que houver uma exceção ou você tentar retornar antes da execução. Exemplo:
FileOutputStream fos = null;
try {
    fos = new FileOutputStream ("teste.txt");
    fos.write ("Hello!");
} catch (IOException ex) {
    ex.printStackTrace(); 
} finally {
    // Devemos fechar o arquivo de qualquer jeito 
    // (a menos, obviamente, que nem tenhamos conseguido abri-lo).
    if (fos != null) try { fos.close(); } catch (IOException ex) { }
}

Mas veja bem, entanglement.
O que me impede de lançar o seu código assim?

FileOutputStream fos = null; try { fos = new FileOutputStream ("teste.txt"); fos.write ("Hello!"); } catch (IOException ex) { ex.printStackTrace(); } // Devemos fechar o arquivo de qualquer jeito // (a menos, obviamente, que nem tenhamos conseguido abri-lo). if (fos != null) try { fos.close(); } catch (IOException ex) { }

E quanto à instrução de retorno no try/catch? Como que seria?

[quote=cake]Mas veja bem, entanglement.
O que me impede de lançar o seu código assim?

FileOutputStream fos = null; try { fos = new FileOutputStream ("teste.txt"); fos.write ("Hello!"); } catch (IOException ex) { ex.printStackTrace(); } // Devemos fechar o arquivo de qualquer jeito // (a menos, obviamente, que nem tenhamos conseguido abri-lo). if (fos != null) try { fos.close(); } catch (IOException ex) { } [/quote]

É que o finally é executado mesmo que a exceção NÂO SEJA IOException.
Digamos que ocorra um OutOfMemoryError na abertura ou gravação do arquivo (pode ocorrer, por que não?)
Mesmo assim, nessas condições, muitas vezes dá para fechar o arquivo direitinho.
Do jeito que você escreveu, se houver um erro que naõ seja IOException, o arquivo vai ficar largado aberto, o que nem sempre é desejável.

Isso é uma coisa mágica. Vamos continuar o exemplo:

public void gravarArquivo (File nomeArquivo) {
     PrintWriter pw = null;
     try {
         pw = new PrintWriter (nomeArquivo);  
         int i = 0;
         while (true) {
             pw.println (i);
             if (i == 10000) return;
             i++;
         }
     } catch (IOException ex) {
         ex.printStackTrace();
     } finally {
         if (pw != null) pw.close();
     }
}

Quando escrevo o “return” não preciso me preocupar em fechar o arquivo. O “finally” foi executado imediatamente antes do return, e ele é que fechou o arquivo. Mágico, não?

1 curtida

Então com o finally, mesmo que ocorra um RuntimeException, eu fecho o meu arquivo? é isso?

É isso mesmo. É por isso que se usa finally (e sinto muita falta disso no C++, que não tem isso).

Outra coisa. O finally roda mesmo que no seu código do try tenha um return.

[code]
try {
System.out.println(“Um”);
return;
} catch (Exception e) {
System.out.println(“Dois”);
} finally {
System.out.println(“Três”);
}

System.out.println(“Quatro”);[/code]

Isso imprime: Um, Três.

Não manjo muito de C++…
To apanhando pra tentar aprender um pouco de Java e de C hehe

Vlw pelas explicacoes, galera :smiley:

Somos 2.