2012-08-02 11 views
7

Eclipse (Juno) da la siguiente advertencia:¿Por qué este código genera una advertencia de "fuga potencial de recursos"?

pérdida de recursos Potencial: 'os' no puede ser cerrado

en la primera línea del cuerpo try en este código:

static void saveDetails(byte[] detailsData) { 
    OutputStream os = null; 
    try { 
     os = sContext.openFileOutput(DETAILS_FILE_NAME, Context.MODE_PRIVATE); 
     os.write(detailsData); 
    } catch (IOException e) { 
     Log.w(LOG_TAG, "Unable to save details", e); 
    } finally { 
     if (os != null) { 
      try { 
       os.close(); 
      } catch (IOException ignored) { 
      } 
     } 
    } 
} 

Se declara que el método openFileOutput arroja un FileNotFoundException.

¿Esto es un falso positivo? Parece un análisis de ruta de ejecución bastante simple.

+0

Sería más fácil si indicara de qué línea se queja el eclipse, pero supongo que está relacionado con la línea openFileOuput: ¿cuánto tiempo dura el objeto abierto? ¿El archivo debe estar cerrado? – atk

+2

@atk: el OP indica que la advertencia se encuentra en la primera línea del cuerpo de prueba. Entonces 'os = sContext.OpenFileOutput ...'. –

+0

Si 'sContext' es nulo, se lanzará una NullPointerException y finalmente no se activará ya que no se trata de una excepción detectada. En este caso, 'os' no se cerrará (ni se abrirá). –

Respuesta

11

En mi opinión, esto es un falso positivo. Su recurso está cerrado en un bloque "finalmente", por lo que no puedo ver qué podría salir mal aquí.

Como nota al margen, si está utilizando Java 7, recomendaría utilizar el modismo "try-with-resources".

static void saveDetails(byte[] detailsData) {  
    try (OutputStream os = sContext.openFileOutput(DETAILS_FILE_NAME, Context.MODE_PRIVATE);) { 
     os = sContext.openFileOutput(DETAILS_FILE_NAME, Context.MODE_PRIVATE); 
     os.write(detailsData); 
    } catch (IOException e) { 
     Log.w(LOG_TAG, "Unable to save details", e); 
    } 
} 
+0

Acabo de intentarlo, e IntelliJ no activa ninguna advertencia en su código. Esto me da aún más confianza sobre el hecho de que es un falso positivo en Eclipse. Y sí, me atrevo a comentar mi propia respuesta :) –

+0

Gracias por la prueba IntelliJ. Me gusta la sintaxis de Java 7, pero desafortunadamente este es un proyecto de Java 6.:( –

-2

Supongo que es porque tiene if (os != null) antes del cierre. Como es condicional, es posible que OutputStream no esté cerrado.

¿Qué ocurre si se intenta:

static void saveDetails(byte[] detailsData) { 
    OutputStream os = null; 
    try { 
     os = sContext.openFileOutput(DETAILS_FILE_NAME, Context.MODE_PRIVATE); 
     os.write(detailsData); 
    } catch (IOException e) { 
     Log.w(LOG_TAG, "Unable to save details", e); 
    } finally { 
     try { 
      os.close(); 
     } catch (IOException ignored) { 
     } 
    } 
} 
+3

Entonces si 'os' * es * nulo, lanzará una NullPointerException en su' finalmente'. –

+0

La pregunta es, ¿'sContext.openFileOutput' alguna vez devolverá nulo? –

+1

@SteveKuo Realmente la pregunta es, ¿' openFileOutput' alguna vez lanza cualquier tipo de excepción en cualquier circunstancia. –

0

Lo que si se mueve tanto de apertura y cierre a la primera cláusula try? Lanzan el mismo tipo de excepción. Y elimine el if os! = Null.

+1

Eso no funcionará - el bloque 'try' podría salir prematuramente debido a una excepción lanzada por' os.write' y luego se omitirá la llamada 'os.close()'. –

Cuestiones relacionadas