इस ट्यूटोरियल में, हम संसाधनों को स्वचालित रूप से बंद करने की कोशिश-के साथ-साथ संसाधनों के स्टेटमेंट के बारे में जानेंगे।
try-with-resources
बयान स्वचालित रूप से बयान के अंत में सभी संसाधनों बंद कर देता है। एक संसाधन कार्यक्रम के अंत में बंद होने वाली वस्तु है।
इसका सिंटैक्स है:
try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block )
जैसा कि उपरोक्त वाक्य-विन्यास से देखा जाता है, हम इस try-with-resources
कथन को घोषित करते हैं ,
try
खण्ड के भीतर संसाधन की घोषणा करना और उसे तत्काल करना ।- संसाधन को बंद करते समय फेंके जाने वाले सभी अपवादों को निर्दिष्ट करना और उन्हें संभालना।
नोट: कोशिश-के साथ संसाधनों का बयान AutoCloseable इंटरफ़ेस को लागू करने वाले सभी संसाधनों को बंद कर देता है।
आइए एक उदाहरण लेते हैं जो try-with-resources
कथन को लागू करता है।
उदाहरण 1: संसाधनों के साथ प्रयास करें
import java.io.*; class Main ( public static void main(String() args) ( String line; try(BufferedReader br = new BufferedReader(new FileReader("test.txt"))) ( while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) ) )
यदि Test.txt फ़ाइल नहीं मिली है तो आउटपुट।
प्रयास के साथ संसाधनों में IOException ब्लॉक => test.txt (ऐसी कोई फ़ाइल या निर्देशिका नहीं)
अगर आउटपुट। टेस्ट फ़ाइल पाया जाता है।
प्रयास-के साथ-साथ संसाधन ब्लॉक लाइन => परीक्षण लाइन दर्ज करना
इस उदाहरण में, हम test.txt
फ़ाइल से डेटा पढ़ने के लिए बफ़रड्रेडर के एक उदाहरण का उपयोग करते हैं।
try-with-resources
बयान के अंदर बफ़रडर को घोषित करना और उसे तत्काल सुनिश्चित करना यह सुनिश्चित करता है कि उसका try
विवरण सामान्य रूप से पूरा होता है या अपवाद को फेंकता है या नहीं।
यदि कोई अपवाद होता है, तो इसे अपवाद हैंडलिंग ब्लॉक या थ्रो कीवर्ड का उपयोग करके नियंत्रित किया जा सकता है।
दबा हुआ अपवाद
उपरोक्त उदाहरण में, try-with-resources
जब बयान से अपवादों को फेंका जा सकता है :
- फ़ाइल
test.txt
नहीं मिली है। BufferedReader
वस्तु को बंद करना ।
एक अपवाद को try
ब्लॉक से भी फेंक दिया जा सकता है क्योंकि किसी भी समय पढ़ा गया फ़ाइल कई कारणों से विफल हो सकता है।
यदि अपवाद को try
ब्लॉक और try-with-resources
स्टेटमेंट दोनों से फेंक दिया जाता है , तो try
ब्लॉक से अपवाद को फेंक दिया जाता है और try-with-resources
स्टेटमेंट से अपवाद को दबा दिया जाता है।
दबे हुए अपवादों को पुनः प्राप्त करना
जावा 7 और बाद में, ब्लॉक Throwable.getSuppressed()
द्वारा फेंके गए अपवाद से विधि को कॉल करके दबाए गए अपवादों को पुनर्प्राप्त किया जा सकता है try
।
यह विधि सभी दमित अपवादों की एक सरणी देती है। हमें catch
ब्लॉक में दबाए गए अपवाद मिलते हैं ।
catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) )
कोशिश के साथ संसाधनों का उपयोग करने के लाभ
यहाँ कोशिश के साथ संसाधनों का उपयोग करने के फायदे हैं:
1. अंत में संसाधन को बंद करने की आवश्यकता नहीं है
जावा 7 ने यह सुविधा शुरू करने से पहले, हमें finally
यह सुनिश्चित करने के लिए ब्लॉक का उपयोग करना था कि संसाधन लीक से बचने के लिए संसाधन बंद है।
यहाँ एक प्रोग्राम है जो उदाहरण 1 के समान है । हालांकि, इस कार्यक्रम में, हमने अंत में बंद संसाधनों का उपयोग किया है।
उदाहरण 2: अंत में ब्लॉक का उपयोग करके संसाधन बंद करें
import java.io.*; class Main ( public static void main(String() args) ( BufferedReader br = null; String line; try ( System.out.println("Entering try block"); br = new BufferedReader(new FileReader("test.txt")); while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) finally ( System.out.println("Entering finally block"); try ( if (br != null) ( br.close(); ) ) catch (IOException e) ( System.out.println("IOException in finally block =>"+e.getMessage()); ) ) ) )
आउटपुट
टेस्ट ब्लॉक की कोशिश कर रहा है
जैसा कि हम उपरोक्त उदाहरण से देख सकते हैं, finally
संसाधनों को साफ करने के लिए ब्लॉक का उपयोग कोड को अधिक जटिल बनाता है।
साथ ही try… catch
प्रखंड में प्रखंडवार सूचना दें finally
? ऐसा इसलिए है क्योंकि इस ब्लॉक के अंदर उदाहरण IOException
बंद करते समय भी हो सकता है इसलिए इसे भी पकड़ा और संभाला जाता है।BufferedReader
finally
try-with-resources
बयान करता है स्वत: संसाधन प्रबंधन । हमें स्पष्ट रूप से संसाधनों को बंद करने की आवश्यकता नहीं है क्योंकि जेवीएम स्वचालित रूप से उन्हें बंद कर देता है। यह कोड को अधिक पठनीय और लिखने में आसान बनाता है।
2. कई संसाधनों के साथ संसाधनों के साथ प्रयास करें
हम try-with-resources
उन्हें अर्धविराम से अलग करके बयान में एक से अधिक संसाधनों की घोषणा कर सकते हैं;
उदाहरण 3: कई संसाधनों के साथ प्रयास करें
import java.io.*; import java.util.*; class Main ( public static void main(String() args) throws IOException( try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) ( while (scanner.hasNext()) ( writer.print(scanner.nextLine()); ) ) ) )
यदि यह प्रोग्राम बिना किसी अपवाद के उत्पन्न होता है, तो Scanner
ऑब्जेक्ट testRead.txt
फ़ाइल से एक पंक्ति पढ़ता है और इसे एक नई testWrite.txt
फ़ाइल में लिखता है ।
जब कई घोषणाएं की जाती हैं, तो try-with-resources
बयान इन संसाधनों को रिवर्स ऑर्डर में बंद कर देता है। इस उदाहरण में, PrintWriter
ऑब्जेक्ट पहले बंद है और फिर Scanner
ऑब्जेक्ट बंद है।
जावा 9 संसाधन-वृद्धि के साथ प्रयास करें
जावा 7 में, try-with-resources
कथन पर प्रतिबंध है । संसाधन को अपने ब्लॉक के भीतर स्थानीय रूप से घोषित करने की आवश्यकता है।
try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code )
यदि हमने जावा 7 में ब्लॉक के बाहर संसाधन की घोषणा की है, तो यह एक त्रुटि संदेश उत्पन्न करेगा।
Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code )
इस त्रुटि से निपटने के लिए, जावा 9 ने try-with-resources
वक्तव्य में सुधार किया ताकि संसाधन के संदर्भ का उपयोग किया जा सके, भले ही इसे स्थानीय रूप से घोषित न किया गया हो। उपरोक्त कोड अब बिना किसी संकलन त्रुटि के निष्पादित होगा।