Cuando ejecutamos código que puede generar excepciones puede pasar que parte de lo que debería suceder nuca llegue a pasar porque se ha producido una exepción y aunque la hemos capturado y procesado eso nos deja en una situación inestable o no deseada. Imagina un programa que enciende y apaga luces, por ejemplo. Como que somos muy cuidadosos, queremos que SIEMPRE al final del programa estén TODAS las luces apagadas. Aunque haya habído excepciones y un interruptor haya fallado. La forma perfecta de controlar eso es con finally. Finally es el código que se ejecutará SIEMPRE al final de un bloque try{}.
Fijate en el ejemplo:
//EjecucionFinally.java
class ExcepctionTres extends Exception{}
public class EjecucionFinally{
static int contador =0;
public static void main(String[] args){
System.out.println("inicio de ejecucion");
while(true){
try{
// el post-incremento es 0 la primera vez....
if(contador++ ==0){
throw new ExcepctionTres();
}
System.out.println("ejecucion "+ contador + " sin excepcion");
}catch(ExcepctionTres e){
System.err.println("ejecucion "+ contador + " lanza excepcion tres");
}finally{
System.err.println("entrando en el finally");
if(contador == 3) break; // salida del while
}
}
}
}
y mira la salida por pantalla…
inicio de ejecucion ejecucion 1 lanza excepcion tres entrando en el finally ejecucion 2 sin excepcion entrando en el finally ejecucion 3 sin excepcion entrando en el finally
Fijate que finaly se ejecuta siempre, tanto si hay excepcion como si no hay excepción. Por lo tanto, en el caso de las luces y los interruptores es el lugar apropiado para apagarlas todas y estar seguros que nos vamos con todas las luces apagadas porque SIEMPRE se ejecutará. Para ver una lista de las excepciones posibles puedes consultar en la documentación de java sobre su api