2012-08-07 41 views
9

Me pregunto por qué recibo esta advertencia con el nuevo eclipse de Juno a pesar de que creo que cerré todo correctamente. ¿Podría decirme por qué recibo esta advertencia en el siguiente fragmento de código?Eclipse Juno: valor de cierre no asignado

public static boolean copyFile(String fileSource, String fileDestination) 
{ 
    try 
    { 
     // Create channel on the source (the line below generates a warning unassigned closeable value) 
     FileChannel srcChannel = new FileInputStream(fileSource).getChannel(); 

     // Create channel on the destination (the line below generates a warning unassigned closeable value) 
     FileChannel dstChannel = new FileOutputStream(fileDestination).getChannel(); 

     // Copy file contents from source to destination 
     dstChannel.transferFrom(srcChannel, 0, srcChannel.size()); 

     // Close the channels 
     srcChannel.close(); 
     dstChannel.close(); 

     return true; 
    } 
    catch (IOException e) 
    { 
     return false; 
    } 
} 

Respuesta

16

si se está ejecutando en Java 7, puede utilizar los nuevos bloques try-con-recursos como así, y sus corrientes se cerrará automáticamente:

public static boolean copyFile(String fileSource, String fileDestination) 
{ 
    try(
     FileInputStream srcStream = new FileInputStream(fileSource); 
     FileOutputStream dstStream = new FileOutputStream(fileDestination)) 
    { 
     dstStream.getChannel().transferFrom(srcStream.getChannel(), 0, srcStream.getChannel().size()); 
     return true; 
    } 
    catch (IOException e) 
    { 
     return false; 
    } 
} 

Usted no tendrá que cierre de forma explícita los canales subyacentes. Sin embargo, si usted no está usando Java 7, usted debe escribir el código de una manera antigua engorroso, con bloques finally:

public static boolean copyFile(String fileSource, String fileDestination) 
{ 
    FileInputStream srcStream=null; 
    FileOutputStream dstStream=null; 
    try { 
     srcStream = new FileInputStream(fileSource); 
     dstStream = new FileOutputStream(fileDestination) 
     dstStream.getChannel().transferFrom(srcStream.getChannel(), 0, srcStream.getChannel().size()); 
     return true; 
    } 
    catch (IOException e) 
    { 
     return false; 
    } finally { 
     try { srcStream.close(); } catch (Exception e) {} 
     try { dstStream.close(); } catch (Exception e) {} 
    } 
} 

ver cuánto mejor es la versión Java 7 es :)

+0

Esto funciona pero me gustaría ahora cómo eliminar esta advertencia sin usar esta característica. Y por qué no es posible declarar directamente el FileChannel en los recursos. EDITAR: acabas de responder mi pregunta, pero ¿por qué no cierras el archivo Channel? – Abbadon

+0

Cuando cierre la secuencia, se cerrará el canal. No necesita cerrarlo explícitamente. – Strelok

+0

Me extrañó totalmente que (para el código java7) la declaración del nuevo FileInputStream y OutputStream ocurra antes de abrir los corchetes para el try {}. Supongo que lo mencionaste llamándolos bloque de prueba con recursos. Después de corregir esto, las advertencias desaparecieron. ¡Quiéralo! –

4

Debe siempre cerca de finally porque si un aumento excepción, usted no cierre los recursos.

FileChannel srcChannel = null 
try { 
    srcChannel = xxx; 
} finally { 
    if (srcChannel != null) { 
    srcChannel.close(); 
    } 
} 

Nota: incluso si usted pone una vuelta en el bloque catch, se llevará a cabo el bloque finally.

+0

Con esa solución I obtener una IOexcepción no controlada! – Abbadon

+0

Bueno, fue un ejemplo, puse un bloque 'catch (IOException ioe)' .... –

3

Eclipse le advierte acerca de la FileInputStream y FileOutputStream que puede hacer referencia ya no.

Cuestiones relacionadas