Aqui te dejo un ejemplo para que veas una manera elegante de manejar todo esto. Fijate que la clase archivo entrada al construirla abre el archivo. Y da los errores apropiados. Igualmente fijate en el finally vacío. No queremos que justo al final de abrir el archivo lo vuelva a cerrar.
//LimpiezaYArchivo.java
import java.io.*;
class ArchivoEntrada{
private BufferedReader entrada;
ArchivoEntrada(String nombre) throws Exception{
try{
entrada = new BufferedReader( new FileReader(nombre) );
// podría lanzar excepcion
}catch(FileNotFoundException e){
System.err.println("no se pudo abrir el archivo "+ nombre);
// no se ha abierto
throw e;
}catch(Exception e){
// todas las demas excepciones deben cerrarlo
try{
entrada.close();
}catch(IOException e2){
System.err.println("no se pudo cerrar el archivo "+ nombre);
}
throw e;
}finally {
// no cerrarlo aqui porque no se ha abierto
}
}
String leerLinea(){
String s;
try{
s= entrada.readLine();
}catch(IOException e){
System.err.println("no se pudo leer el archivo ");
s= "errrrror";
}
return s;
}
void cerrar(){
try{
entrada.close();
}catch(IOException e2){
System.err.println("no se pudo cerrar el archivo ");
}
}
}
public class LimpiezaYArchivo{
public static void main(String[] args){
try{
ArchivoEntrada archivo = new ArchivoEntrada("LimpiezaYArchivo.java");
String s;
int i = 1;
while ( (s= archivo.leerLinea() ) != null){
System.out.println(""+ i++ + ": " + s);
}
archivo.cerrar();
}catch(Exception e){
System.err.println("capturado en el metodo main, e.printStackTrace()" );
e.printStackTrace(System.err);
}
}
}