2013-02-13 9 views
14

में संसाधन रिसाव चेतावनी Eclipse में मुझे Resource leak: 'ps' is not closed at this location चेतावनी मिली जो मुझे समझ में नहीं आया।ग्रहण

मेरे Java कोड में मैं "ps" को एक तैयार वक्तव्य के रूप में घोषित करता हूं और मैं इसे कई बार (और बंद) करता हूं।

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 
     }; 
} 

"संसाधन रिसाव" -Warning बाकी खंड में "अपडेट" -Statement पर आता है: तब मैं निम्न क्रम है। यदि मैं कोशिश ब्लॉक शुरू करने से पहले ps = null सेट करता हूं, तो कोई चेतावनी नहीं है।

यदि दूसरा अद्यतन-वक्तव्य टिप्पणी की गई है, तो कोई चेतावनी नहीं दिखायी जाएगी।

क्या यह समझ या जावा/ग्रहण समस्या है?

+1

मेरा अनुमान है कि ग्रहण यह पता लगा रहा है कि आप पहले तैयार कथन ऑब्जेक्ट का उपयोग कर रहे हैं और SQLException के लिए संभावित कारणों से इसे ठीक से बंद नहीं किया जा सकता है। यदि आप 'ps = null' करते हैं; अंत में ब्लॉक में इसे शायद ठीक किया जाएगा और इसे साफ़ करने के लिए यह एक और तर्कसंगत जगह होगी। –

उत्तर

3

मुझे लगता है कि यह आपके द्वारा उपयोग किए जा रहे चेकर के साथ एक समस्या है।

अपना कोड initialization और use ब्लॉक में तोड़ दें। इसके अलावा, प्रारंभिक ब्लॉक से अपवाद फेंक दें (या प्रारंभिक वापसी करें)। इस तरह वहाँ अशक्त के लिए जाँच करने की कोई जरूरत नहीं है जब आप use ब्लॉक

// 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

मैं इसे आज़माउंगा ... –

10

के बाद संसाधन जारी आपको यह चेतावनी आप जावा 7. उपयोग कर रहे हैं इस मामले में है, तो आप संसाधन AutoClosable लागू करता है अपने आप को बंद नहीं करना चाहिए। आप 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. 

मैं वास्तव में नहीं जानता कि क्यों if/else बयान की उपस्थिति चेतावनी दिखाई देते हैं या गायब हो जाता है। लेकिन जावा 7 ऊपर वर्णित ऑटो क्लोजेबल संसाधनों के साथ काम करने का तरीका सुझाता है, इसलिए इसे आजमाएं।

+0

धन्यवाद, इससे मुझे मदद मिली। चूंकि मैं अभी तक जावा 7 को पूरी तरह से प्रतिबद्ध करने के लिए तैयार नहीं हूं, मैंने अभी ग्रहण को संसाधनों के लीक को अनदेखा करने के लिए कहा है। शायद खतरनाक है, लेकिन अब के लिए काम करेगा। – rjcarr

-4

परिवर्तनीय नाम को सी से एमसी में बदलें। मुझे लगता है कि एक चर नाम के रूप में सी का उपयोग करते हुए यह एक अजीब गड़बड़ है। धन्यवाद चार्ली