java - Why compiler warns about resource leak? -


i cannot understand why compiler warns me resource leak (resource leak: 'conn' not closed @ location) in following code:

    connection conn = null;     try {         conn = databaseconnectionpool.getconnectionfrompool();         // code         try {             // other code         } catch (final someexception e) {             // more code             throw e; // resource leak: 'conn' not closed @ location         }      } catch (final sqlexception | otherexceptions e) {         // more code     } {         try {             // bunch of code         } {             databaseconnectionpool.freeconnection(conn);         }     } 

note if write this

    connection conn = null;     try {         conn = databaseconnectionpool.getconnectionfrompool();         // code         try {             // other code         } catch (final someexception e) {             // more code             throw e;         } {             databaseconnectionpool.freeconnection(conn);         }      } catch (final sqlexception | otherexceptions e) {         // more code     } {         // bunch of code     } 

the warning gone.

the compiler quite dump. cannot know databaseconnectionpool.freeconnection(conn) call close on conn. not sure why second example not trigger warning, feature not totally perfect , can yield false negatives. basically, resource should closed calling close method directly @ place resource acquired; way compiler can figure out want close it, not inter-procedural analysis check if called function calls close.

with java7, should consider using try-with-resource statement; the encouraged way handle resources, i.e.:

try(connection conn = ...){    // conn     // no close necessary here, done implicitly try statement } 

your whole pattern of closing connection calling method other close seems flawed me (it works, discourage usage): resource should able close calling close. if resource requires databaseconnectionpool.freeconnection called close it, violating java's resource contract. if use try-with-resource statement, have no choice anyway: statement call close , not method.


Comments

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

Python ctypes access violation with const pointer arguments -