मेरे पास तीन प्रश्न हैं।एक BufferedReader का क्या होता है जो कॉल करने योग्य.call के भीतर बंद नहीं होता है?
समझाओ, मैं किसी के कोड की समीक्षा कर रहा था, और देखा कि BufferedReader
कभी-कभी बंद नहीं किया जा रहा है। आमतौर पर, ग्रहण एक चेतावनी देता है कि यह एक संभावित स्मृति रिसाव है (और मैं इसे ठीक करता हूं)। हालांकि, एक कॉल करने योग्य आंतरिक कक्षा के भीतर, कोई चेतावनी नहीं है।
class outerClass {
...
public void someMethod() {
Future<Integer> future = outputThreadPool.submit(new innerClass(this.myProcess.getInputStream(), threadName));
...
}
class innerClass implements Callable<Integer> {
private final InputStream stream;
private final String prepend;
innerClass(InputStream stream, String prepend) {
this.stream = stream;
this.prepend = prepend;
}
@Override
public Integer call() {
BufferedReader stdOut = new BufferedReader(new InputStreamReader(stream));
String output = null;
try {
while ((output = stdOut.readLine()) != null) {
log.info("[" + prepend + "] " + output);
}
} catch (IOException ignore) {
// I have no idea why we're ignoring this... :-|
}
return 0;
}
}
}
लोग हैं, जो कोड लिखा जावा डेवलपर्स अनुभवी हैं, इसलिए मेरा पहला विचार है कि यह जानबूझकर है ... लेकिन यह हो सकता है कि वे जल्दी में थे जब वे यह लिखा था और बस इसे अनदेखा।
मेरे प्रश्न हैं:
ग्रहण क्यों उजागर नहीं करता है यह (जो निम्न प्रश्नों के उत्तर द्वारा उत्तर दिया जा सकता है)?
कॉल() विधि के भीतर बंद होने पर सबसे बुरा क्या हो सकता है? (मैं एक अच्छे कारण के बारे में नहीं सोच सकता ... और मैं थोड़ी देर के लिए खोज कर रहा हूं ... लेकिन हो सकता है कि यह जानबूझकर BufferedReader को बंद न करें)
क्या हो सकता है कि सबसे बुरा क्या हो सकता है BufferedReader नहीं आंतरिक कक्षा के भीतर बंद हो गया है?
नहीं चेतावनी पर चिह्नित करने और अधिक एक सचेत कहना –
मैं एक जोड़े को जवाब है कि एक दूसरे के खंडन करने के लिए लग रहे हो "यह इस मामले में यह करने के लिए ठीक है" निर्णय से एक ग्रहण बग की तरह लगता है। एक ओर कुछ लोगों का कहना है कि BufferedReader बंद होना चाहिए। दूसरी तरफ, वे कहते हैं कि इसे बंद नहीं किया जाना चाहिए क्योंकि इसे बंद करना इनपुटस्ट्रीम को बंद कर देगा, और कॉलिंग क्लास को इसकी आवश्यकता हो सकती है ... – GLaDOS
देखें [यह सवाल] (http://stackoverflow.com/questions/ 1388602/कर-ए-आवश्यकता के करीब दोनों-FileReader और bufferedreader)। यदि किसी इनपुट में 'इनपुटस्ट्रीम' जैसे संसाधन को पास किया जा रहा है, तो इसका मतलब है कि किसी और ने इसे खोला है, इसलिए किसी और को इसे बंद करना चाहिए। यदि वे आपकी विधि में एक स्ट्रीम पास करते हैं और फिर इसे कहीं और उपयोग करने का प्रयास करते हैं, तो यह टूट जाएगा क्योंकि यह बंद हो जाएगा ('बफर रीडर' को बंद करने से इसकी स्ट्रीम बंद हो जाती है), भले ही आपकी विधि को केवल एक चीज़ करने की आवश्यकता हो धारा। – Brian