2010-04-17 6 views
7

me sale un error crítico con findbugs:método puede fallar para cerrar la corriente de excepción

El método crea un objeto corriente IO, no asignarlo a cualquier campo, pasarlo a otros métodos, o devolverlo , y no parece cerrarlo en todas las rutas de excepción posibles fuera del método. Esto puede provocar una fuga de descriptor de archivo. En general, es una buena idea utilizar un bloque finally para garantizar que las transmisiones estén cerradas.

try { 
... 
stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
... 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} finally { 
    try { 
     if (stdError != null) { 
      stdError.close(); 
     } 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

¿Es necesario cerrar InputStreamReader también o p.getErrorStream (Devuelve InputStream)?

Respuesta

4

BufferedReader y InputStreamReader cierran la transmisión subyacente cuando están cerrados. Debería estar bien cerrando stdError

5

¿Qué sucede cuando se produce una excepción al crear el objeto BufferedReader? La secuencia administrada por el objeto InputStreamReader no se cierra hasta algún momento en el futuro cuando el recolector de basura decide destruir el objeto.

Es probable que tenga problemas similares si se produce una excepción al crear el objeto InputStreamReader.

+1

Usted y findbugs son técnicamente correctos. Sin embargo, la única forma en que ese constructor de BufferedReader puede fallar es con un 'Error'; p.ej. OOME o SOE. Es poco probable que una aplicación intente recuperarse de una de ellas, por lo que es poco probable que la fuga de la secuencia sea importante. –

Cuestiones relacionadas