2010-06-16 19 views
21

मैं एक buffered लेखक और मेरा कोड का उपयोग कर रहा हूँ, अंत में ब्लॉक में लेखक बंद कर देता है। मेरा कोड इस तरह है।क्या आखिर में कोशिश करने का प्रयास करना ठीक है?

........... 
    BufferedWriter theBufferedWriter = null; 
    try{ 
    theBufferedWriter =..... 
    .... 
    ...... 
    ..... 
    } catch (IOException anException) { 
    .... 
    } finally { 
     try { 
      theBufferedWriter.close();    
     } catch (IOException anException) { 
      anException.printStackTrace(); 
      } 
    } 

मैं अंत में में साफ ऊपर कोड के अंदर कोशिश पकड़ उपयोग करने के लिए के रूप में theBufferedWriter भी एक IOException फेंक सकती है। मैं इस अपवाद को कॉलिंग मेथोस पर फेंकना नहीं चाहता हूं। आखिर में कोशिश करने का प्रयास करने के लिए यह एक अच्छा अभ्यास है? यदि विकल्प नहीं है तो क्या विकल्प है? कृपया सुझाव दे।

सादर, हीरल

+1

यह ठीक है, लेकिन अशक्त पहले बेहतर है की जाँच करने के। – qrtt1

+0

+1 यह सुंदर नहीं है लेकिन इसे –

उत्तर

14

इस अपाचे commons-io से IOUtils.closeQuiety उपयोग करने के लिए है करने के लिए एक कुछ हद तक अच्छे तरह से कर सकते हैं। यह आपके कोड को साफ रखता है और जावा में निहित बॉयलरप्लेट में से कुछ को हटा देता है।

आप कोड तो हो जाता है:

BufferedWriter theBufferedWriter = null; 
try{ 
    theBufferedWriter = ... 
    ... 
} catch (IOException anException) { 
    ... 
} finally { 
    IOUtils.closeQuietly(theBufferedWriter); 
} 

बहुत अच्छे और अधिक अर्थपूर्ण।

+3

बंद करना इस तरह buffered लेखक जोखिम भरा है; यदि वर्ण बफर में रहते हैं और उन्हें लिखने का प्रयास करते समय अपवाद फेंकता है, तो डेटा छोटा कर दिया जाता है और आपका एप्लिकेशन त्रुटि को संभाल नहीं करता है। इसे सुरक्षित करने के लिए, आपको पकड़ ब्लॉक से ठीक पहले 'क्लोज़' कॉल करना होगा। – McDowell

+2

@McDowell: जानना अच्छा है। संभवतः आप पकड़ ब्लॉक से पहले 'फ्लश()' को भी कॉल कर सकते हैं, है ना? –

+2

बफर बंद करने से इसे फ्लश कर दिया जाएगा (जावाडोक देखें)। _ यदि यह स्पष्ट नहीं है, तो इस पैटर्न को 'क्लोज़' को दो बार बुलाया जाना चाहिए ._ यदि आपने _try/finally {close} _ को मौजूदा _try_ ब्लॉक में ले जाया है, तो आप 1) केवल एक बार 'क्लोज़' कॉल करने की आवश्यकता होगी 2) अनावश्यक 'शून्य 'असाइनमेंट से बचें 3) किसी तृतीय पक्ष लाइब्रेरी को आयात करने की आवश्यकता नहीं है। नेस्टेड ट्रे बदसूरत लगते हैं, लेकिन आप आम तौर पर इस स्थानीय रूप से किसी भी तरह से त्रुटि को संभालने में त्रुटि के बारे में निर्णय नहीं ले सकते हैं, इसलिए कैच ब्लॉक कॉलर में कॉल स्टैक को आगे बढ़ाएगा। http://illegalargumentexception.blogspot.com/2008/10/java-how-not-to-make-mess-of-stream.html – McDowell

11

पूर्व जावा 7 में, मैं कहना चाहता हूँ कि तुम क्या लिखा है सबसे अच्छा समाधान है।

जावा 7 में और इसके बाद आपके पास Automatic Resource Management इन चीजों को सरल बनाने के लिए है। इस सुविधा के साथ, आप

BufferedWriter theBufferedWriter = null; 
try (BufferedWriter theBufferedWriter = ...) { 
.... 
...... 
..... 
} catch (IOException anException) { 
.... 
} 
+0

करना है, मैं सहमत हूं कि संसाधन के साथ प्रयास जावा 7 के बाद से सबसे अच्छा तरीका है: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – JavaDev

1

यही वह है जिसे हमें जावा 7 और ARM Blocks तक जीना होगा।

2

या आप Lombok और @Cleanup एनोटेशन का उपयोग कर सकते हैं और आप कभी भी अंत में फिर से प्रयास करने की कोशिश नहीं करेंगे।

इस तरह आप सामान्य रूप से लिखते थे यह है (ध्यान दें throws IOException):

//Vanilly Java 

import java.io.*; 

public class CleanupExample { 
    public static void main(String[] args) throws IOException { 
    InputStream in = new FileInputStream(args[0]); 
    try { 
     OutputStream out = new FileOutputStream(args[1]); 
     try { 
     byte[] b = new byte[10000]; 
     while (true) { 
      int r = in.read(b); 
      if (r == -1) break; 
      out.write(b, 0, r); 
     } 
     } finally { 
     out.close(); 
     } 
    } finally { 
     in.close(); 
    } 
    } 
} 

अब लंबोक के साथ आप सिर्फ @Cleanup धाराओं पर लिखने

import lombok.Cleanup; 
import java.io.*; 

public class CleanupExample { 
    public static void main(String[] args) throws IOException { 
    @Cleanup InputStream in = new FileInputStream(args[0]); 
    @Cleanup OutputStream out = new FileOutputStream(args[1]); 
    byte[] b = new byte[10000]; 
    while (true) { 
     int r = in.read(b); 
     if (r == -1) break; 
     out.write(b, 0, r); 
    } 
    } 
} 
1

यह ठीक है, लेकिन आप अगर theBufferedWriter का परीक्षण करना चाहिए इसे बंद करने से पहले शून्य नहीं है।
तुम भी कर सकता है:

BufferedWriter theBufferedWriter; 
try { 
    theBufferedWriter = new ... 
    try { 
     ... 
    } finally { 
     try { 
      theBufferedWriter.close(); 
     } catch (IOException closeException) { 
      closeException.printStackTrace(); 
     } 
    } 
} catch (IOException anException) { 
    ... 
} 

या:

BufferedWriter theBufferedWriter; 
try { 
    theBufferedWriter = new ... 
} catch (IOException createException) { 
    // do something with createException 
    return; // assuming we are in a method returning void 
} 

try { 
    ... 
} catch (IOException anException) { 
    ... 
    // assuming we don't return here 
} 

try { 
    theBufferedWriter.close(); 
} catch (IOException closeException) { 
    closeException.printStackTrace(); 
} 

लेकिन ज्यादातर मैं ऐसे कार्य कर एक समर्पित विधि में (उदाहरण के लिए एक फ़ाइल लेखन) और इसलिए फोन करने वाले/एक अपवाद फेंकने के लिए पसंद करते हैं

void someMethod(...) throws IOException { 
    BufferedWriter theBufferedWriter = new ... 

    try { 
     ... 
    } catch (IOExcepption anException) { 
     try { 
      theBufferedWriter.close(); 
     } catch (IOException closeException) { 
      closeException.printStackTrace(); 
      // closeException is not thrown, anException represents the main/first problem 
     } 
     throw anException; 
    } 

    theBufferedWriter.close(); // throws the Exception, if any 
} 

कृपया ध्यान दें:: अंग्रेजी मेरी एफआईआर नहीं है, यह (उदाहरण के लिए किसी अन्य फ़ाइल के लिए पूछ, आवेदन रोक, ...) संभाल कर सकते हैं टी और न ही मेरी दूसरी भाषा, किसी भी मदद की सराहना की जाएगी

0

अंत में एक कोशिश करने के लिए ठीक है। यह वह टूल है जो आप करना चाहते हैं। हालांकि, मुझे लगता है कि बंद पर IOException फेंकना असामान्य है कि मैं इसे शरीर में किसी भी अपवाद को दबाने की अनुमति दूंगा।

try { 
    BufferedWriter writer = ..... 
    try { 
     ..... 
    } finally { 
     writer.close(); 
    } 
} catch (IOException e) { 
    .... 
} 
संबंधित मुद्दे