2013-02-13 12 views
14

In Eclipse Ho ricevuto un avvertimento Resource leak: 'ps' is not closed at this location che non capisco.Resource avvertimento perdita nel eclisse

Nel mio codice Java dichiaro il "ps" come una dichiarazione preparata e uso (e chiudere) molte volte. Poi ho la seguente sequenza:

try { 
    if(condition) { 
     ps = c.prepareStatement("UPDATE 1 ..."); 
    } else { 
     ps = c.prepareStatement("UPDATE 2 ..."); 
    } 
    ps.executeUpdate(); 
} catch (SQLException e) { 
    // exception handling 
} finally { 
    if (null != ps) 
     try { 
      ps.close(); 
     } catch (SQLException e) { 
      // exception handling 
     }; 
} 

la "risorsa fuga" -Warning si accende il "Update" -Riaffermazione nella sezione altro. Se ho impostato ps = null prima di iniziare il blocco try, non v'è alcun avvertimento.

Se il secondo UPDATE-Statement è commentata, verrà mostrato nessun avvertimento.

È che la comprensione o un Java/Eclipse problema?

+1

La mia ipotesi è che Eclipse rilevi che stai usando l'oggetto statement preparato in precedenza e, a causa del potenziale per SQLException, potrebbe non chiuderlo correttamente. Se esegui 'ps = null;' nel blocco finally sarà probabilmente risolto e questo sarebbe un posto più razionale per ripulirlo. –

risposta

3

penso, è un problema con il controllo che si sta usando.

rompere il vostro codice in initialization e use blocchi. Inoltre, lanciare un'eccezione dal blocco di inizializzazione (o eseguire un ritorno anticipato). In questo modo non c'è bisogno di controllare per nulla quando si rilascia la risorsa dopo use blocco

// initialization 
// Note that ps is declared final. 
// I think it will help to silence your checker 
final PreparedStatement ps; 

try { 
    if(bedingungen ...) { 
     ps = c.prepareStatement("UPDATE 1 ..."); 
    } else { 
     ps = c.prepareStatement("UPDATE 2 ..."); 
    } 
} 
catch (SQLException e) { 
    log.error("Problem creating prepared statement, e); 
    throw e; 
} 

// use 
try { 
    ps.executeUpdate(); 
} catch (SQLException e) { 
    log.error("Problem decrementing palets on " + srcElement.getName() + 
     ": " + e.getMessage()); 
} 
finally { 
    try { 
     ps.close(); 
    } catch (SQLException e) { 
     log.warn("Error closing PreparedStatement: " + e.getMessage()); 
    }; 
} 
+0

Lo proverò ... –

10

Se si dispone di questo avviso si sta utilizzando Java 7. In questo caso non si deve chiudere la risorsa che implementa AutoClosable te stesso. Si dovrebbe inizializzare tali risorse in sezione di inizializzazione speciale di try statementcommented:

// decide which update statement you need: 
// (your if should be here) 
String update = ....; 
try (
    ps = c.prepareStatement(update); 
) { 
    // use prepared statement here. 
} catch (SQLException) { 
    // log your exception 
    throw new RuntimeException(e); 
} 
// no finally block is needed. The resource will be closed automatically. 

Io davvero non so perché la presenza di if/else istruzione causa l'avviso a comparire o scomparire. Ma java 7 consiglia il modo di lavorare con le risorse auto chiudibili che ho descritto sopra, quindi prova questo.

+0

Grazie, questo mi ha aiutato. Dato che non sono ancora pronto per il commit completo di Java 7, ho appena detto a Eclipse di impostare le perdite di risorse da ignorare. Probabilmente pericoloso, ma funzionerà per ora. – rjcarr

-4

Modificare il nome della variabile da c a mC. Penso che sia un problema strano quando si usa c come nome di variabile. Grazie Charlie