2012-07-24 11 views
5

मेरे पास निम्न जावा क्लास है जो एक चीज करता है, config.properties से मान निकालती है।क्या मुझे कोशिश/पकड़/आखिरकार ब्लॉक के साथ fileInputStream.close को घेरने की आवश्यकता है? यह कैसे किया जाता है?

जब fileInputStream को बंद करने का समय आता है, तो मुझे लगता है कि मैंने विकिपीडिया पर पढ़ा है कि यह अंततः ब्लॉक में होना अच्छा है। क्योंकि यह ईमानदारी से कोशिश/पकड़ ब्लॉक में ठीक काम करता है।

क्या आप अंत में अनुभाग में fileInputStream.close() प्राप्त करने के लिए मुझे सुधार दिखा सकते हैं?

ConfigProperties.java पैकेज बेस;

import java.io.FileInputStream; 
import java.util.Properties; 

public class ConfigProperties { 

    public FileInputStream fileInputStream; 
    public String property; 

    public String getConfigProperties(String strProperty) { 

     Properties configProperties = new Properties(); 
     try { 

      fileInputStream = new FileInputStream("resources/config.properties"); 
      configProperties.load(fileInputStream); 
      property = configProperties.getProperty(strProperty); 
      System.out.println("getConfigProperties(" + strProperty + ")"); 

      // use a finally block to close your Stream. 
      // If an exception occurs, do you want the application to shut down? 

     } catch (Exception ex) { 
      // TODO 
      System.out.println("Exception: " + ex); 
     } 
     finally { 
      fileInputStream.close(); 
     } 

     return property; 
    } 
} 

क्या समाधान केवल ग्रहण के रूप में करने के लिए है और आखिरकार ब्लॉक में ऐसा करता है?

finally { 
    try { 
     fileInputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

सभी को धन्यवाद!

+1

FYI करें: कॉमन्स-कब एक अच्छा काम है: IOUtils.closeQuietly() जो बंद करने की कोशिश/पकड़ का ख्याल रखेगा। आपका कोड बहुत अच्छा लगेगा :) ध्यान रखें कि यह फ़ंक्शन आपको IOException का जवाब देने का मौका नहीं देता है, लेकिन आम तौर पर लोग ऐसा नहीं करते हैं और अपवाद को अनदेखा करते हैं। अगर आपको जवाब देने की ज़रूरत है, तो अपनी खुद की उपयोगिता विधि बनाएं जो एक स्टैक ट्रेस को लॉग या प्रिंट करता है या जो भी आपको करने की ज़रूरत है। – Matt

उत्तर

7

क्योंकि FileInputStream.close() आईओएक्सप्शन फेंकता है, और आखिर में {} ब्लॉक अपवाद नहीं पकड़ता है। इसलिए आपको इसे पकड़ने या संकलित करने के लिए इसे घोषित करने की आवश्यकता है। ग्रहण का सुझाव ठीक है; अंत में {} ब्लॉक के अंदर IOException पकड़ो।

+0

आप [IOUtils.closeQuietly()] (http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/IOUtils.html#closeQuietly (java.io.Closeable)) कॉमन्स आईओ से विधि। यह फेंकने वाले सभी IOExceptions को छोड़ने के लिए करीबी विधि को लपेटता है। एक और कोशिश/पकड़ ब्लॉक होने से क्लीनर। –

11

हां, यह सामान्य प्री-जावा 7 समाधान है। हालांकि, जावा 7 की शुरूआत के साथ, वहाँ अब try-with-resource बयान जो स्वचालित रूप से किसी भी घोषित संसाधनों बंद हो जाएगा जब try ब्लॉक बाहर निकलता है:

try (FileInputStream fileIn = ...) { 
    // do something 
} // fileIn is closed 
catch (IOException e) { 
    //handle exception 
} 
7

मानक दृष्टिकोण है:

FileInputStream fileInputStream = null; 
try { 
    fileInputStream = new FileInputStream(...); 
    // do something with the inputstream 
} catch (IOException e) { 
    // handle an exception 
} finally { // finally blocks are guaranteed to be executed 
    // close() can throw an IOException too, so we got to wrap that too 
    try { 
     if (fileInputStream != null) { 
      fileInputStream.close(); 
     }   
    } catch (IOException e) { 
     // handle an exception, or often we just ignore it 
    } 
} 
संबंधित मुद्दे

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