2012-01-24 11 views
7
try { 
    FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} finally { 
    fr.close(); 
} 

fr.close() एक त्रुटि दिखाता है:बंद फ़ाइल काम नहीं करता है

fr cannot be resolved

मैंने पढ़ा था कि अंत में ब्लॉक में एक फ़ाइल को बंद करने के लिए एक अच्छी आदत है।
क्या गलत है?

उत्तर

17

परिवर्तनीय fr केवल try ब्लॉक के भीतर दायरा है। अंत में ब्लॉक में यह दायरे से बाहर है। आप try ब्लॉक पहले यह घोषित करने के लिए की जरूरत है:

FileReader fr = null; 
try { 
    fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} finally { 
    if (fr != null) { 
     try { 
      fr.close(); 
     } catch (IOException e) { 
      // This is unrecoverable. Just report it and move on 
      e.printStackTrace(); 
     } 
    } 
} 

यह काफी कोड का एक आम पैटर्न है, इसलिए इसे भविष्य इसी तरह की परिस्थितियों के लिए यह याद रखना अच्छा है।

इस विधि से IOException फेंकने पर विचार करें - मुद्रण ट्रैक निशान कॉल करने, करने के लिए बहुत उपयोगी नहीं है और आप नेस्टेड कोशिश पकड़ की जरूरत नहीं होगी चारों ओर fr.close()

+0

यदि मैं ऐसा करता हूं तो यह कहता है कि फ़ाइल को बंद करते समय मुझे एक और प्रयास ब्लॉक जोड़ने की आवश्यकता है। मैंने पिछली पोस्ट पढ़ी जहां कहा गया था कि इसके बारे में कुछ भी नहीं किया जा सकता है। तो, यह सबसे अच्छा तरीका होगा? – noMAD

+0

हां, यह कष्टप्रद है। अक्सर ऐसा करने के लिए "closeQuietly" (या इसी तरह) नामक उपयोगिता विधि लिखती है। यह अपवाद को पकड़ता है और अनदेखा करता है। – user949300

+0

नेस्टेड 'try/catch' के लिए संपादित उत्तर देखें - एक सामान्य पैटर्न – Bohemian

5

अब अंत में ब्लॉक की जरूरत नहीं है,

try (FileReader fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr);){ 

    String line = null; 

    } 

} catch(FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} 

अब स्वचालित रूप से अपने पाठकों को

+2

हां, लेकिन केवल जावा में 7. जावा 6 और पहले के पास यह नहीं है। – user949300

+0

हाँ, यह सच है। – Kushan

+0

यदि कोई आश्चर्य करता है कि यह क्यों है, तो "संसाधनों के साथ प्रयास करें" की खोज करें – axxis

0

बंद आप अपने कार्यक्षेत्र के साथ एक समस्या है। क्या तुम सच में लगता है कि सिंटैक्स का उपयोग करना चाहते हैं तो आप इस तरह इसे ठीक करना चाहिए:

FileReader fr = null; 
try { 
    fr = new FileReader(file); 
    BufferedReader br = new BufferedReader(fr); 
    String line = null; 
} catch (FileNotFoundException fnf) { 
    fnf.printStackTrace(); 
} finally { 
    if(fr != null) 
     fr.close(); 
} 

कि जिस तरह से, fr अंत में के ब्लॉक दायरे में उपलब्ध नहीं होगा।

संबंधित मुद्दे