2013-04-09 8 views
33

अगर यह गलत है तो कृपया मुझे सही करें: जावा 7 के प्रयास-संसाधन संसाधन में, संसाधन की close() विधि द्वारा फेंकने वाले किसी भी अपवाद को या तो मेरी विधि द्वारा फेंक दिया जाना चाहिए या मुझे पूरी कोशिश को try में लपेटना होगा जो किसी को पकड़ता है अपवाद close() द्वारा फेंक दिया गया।कोशिश करें संसाधनों के साथ: क्या मुझे करीबी() विधि के अपवादों को फेंकना या पकड़ना चाहिए?

यदि ऐसा है, तो मुझे आश्चर्य होगा कि क्या मैं इसका अधिक उपयोग करूँगा। मैं निश्चित रूप से throwclose() द्वारा दिए गए अपवादों को नहीं चाहता हूं, कॉलर को यह नहीं पता होगा कि इसके साथ क्या किया जाए। और try को लपेटने के लिए बस close() को संभालने के लिए कम से कम मुझे बहुत सुंदर नहीं लगेगा।

संपादित करें: मुझे लगता है कि मैंने गलती से दो प्रश्न पूछे, जिनमें से एक डुप्लिकेट था।

प्रश्न 1. क्या मुझे यह घोषणा करना है कि मेरी विधि close() विधि से अपवाद फेंकता है या किसी अन्य प्रयास में प्रयास-संसाधनों को लपेटता है? (प्रस्तावित डुप्लिकेट में उत्तर नहीं दिया गया।)

प्रश्न 2. क्या संसाधन को चुपचाप बंद करने का कोई तरीका है? (जाहिर है एक नकली है, इसलिए मैं सवाल से बाहर उस वाक्य ले रहा हूँ। उम्मीद है कि इस सवाल का संतोषजनक ढंग से अनूठा बनाता है।)

+0

संसाधन है कि 'पास()' से फेंक का एक बहुत लागू किया है कि तुम है है? –

+0

बस कुछ, लेकिन मैं उन्हें बहुत उपयोग करता हूं (परिणामसेट, BufferedReader, RandomAccessFile)। –

उत्तर

26
Java Language Specification ($14.20.3.2) से

उद्धरण:

14.20.3.2 विस्तारित कोशिश के साथ-संसाधनों

एक कोशिश के साथ-संसाधन कम से कम एक पकड़ खंड और/या एक अंत में साथ बयान खंड को विस्तारित प्रयास-संसाधन-संसाधन कथन कहा जाता है। एक विस्तारित कोशिश के साथ-संसाधनों बयान का मतलब:

        कोशिश ResourceSpecification
                ब्लॉक
        कैचऑप्ट
        अंत मेंऑप्ट

के लिए निम्न अनुवाद द्वारा दिया जाता है एक बुनियादी कोशिश के साथ-संसाधनों बयान (§14.20.3.1) एक कोशिश पकड़ अंदर नेस्टेड या कोशिश करें-अंत में या प्रयास-अंत-अंत में बयान:

        कोशिश {
                कोशिश ResourceSpecification
                        ब्लॉक
       }
        कैचऑप्ट
        अंत मेंऑप्ट

अनुवाद का प्रभाव रिसोर्स स्पेसिफिकेशन को "अंदर" कथन का प्रयास करना है। यह स्वत: प्रारंभिकरण या किसी भी संसाधन को बंद करने के कारण अपवाद को पकड़ने के लिए विस्तारित प्रयास-संसाधन-संसाधन विवरण का कैच क्लॉज की अनुमति देता है।

तो, मूल रूप से, आवरण पहले से ही

18

the Java tutorial

एक कोशिश के साथ-संसाधनों बयान से पकड़ और अंत में ब्लॉक हो सकता है एक साधारण कोशिश कथन की तरह। संसाधनों के साथ एक प्रयास में, संसाधनों को घोषित किए जाने के बाद बंद होने के बाद कोई भी पकड़ या आखिरकार ब्लॉक चलाया जाता है।

(जोर मेरा)

तो आप बस

try (BufferedReader br = 
       new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 
catch (IOException e) { 
    // handle the exception that has been thrown by readLine() OR by close(). 
} 
+0

संसाधन बंद हो जाएगा यदि यह पकड़ नहीं लेता है और अंत में कोई ब्लॉक नहीं है? –

+0

लिंक पर क्लिक करें और पढ़ें। –

6

आप किसी अन्य कोशिश पकड़ ब्लॉक में कोशिश के साथ-संसाधनों रैप करने के लिए की जरूरत नहीं है, तो आप बस एक पकड़ने जोड़ने कर सकते हैं ब्लॉक:

class Foo implements AutoCloseable { 
    public void close() throws Exception { 
     throw new Exception(); 
    } 
} 

public class Try { 
    public static void main(final String[] args) { 
     try(Foo f = new Foo()) { 
      System.out.println("No op!"); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
1

आपको उचित catch (Exception e) { } खंड जोड़ने में सक्षम होना चाहिए। यदि आपको किसी विशिष्ट व्यक्ति के लिए विशेष हैंडलिंग करने की आवश्यकता है, या आप इसे Exception पकड़ सकते हैं, यदि आपको इसकी आवश्यकता बहुत अधिक है।

try (Statement stmt = con.createStatement()) { 
    ResultSet rs = stmt.executeQuery(query); 

    while (rs.next()) { 
     String coffeeName = rs.getString("COF_NAME"); 
     int supplierID = rs.getInt("SUP_ID"); 
     float price = rs.getFloat("PRICE"); 

     System.out.println(coffeeName + ", " + supplierID + ", " + 
          price + ", " + sales + ", " + total); 
    } 
} catch (Exception e) { 
    System.out.println("Exception while trying to through the queries. ", e); 
} 

यह जावा 7 है के बाद से, आप वास्तव में कई अपवाद पकड़ खंड प्रति रख सकते हैं, या आप बस सबसे बाहरी अपवाद आप चाहते हैं पकड़ कर सकते हैं।

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