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á
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).
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) { }
}
[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?