जावा में एरर हैंडलिंग: try/catch से लेकर एडवांस्ड तकनीकों तक
एक विश्वसनीय जावा एप्लिकेशन के लिए एक्सेप्शन हैंडलिंग एक महत्वपूर्ण स्तंभ है। अधिकांश डेवलपर्स बुनियादी try-catch-finally कंस्ट्रक्ट से परिचित हैं, लेकिन उन्नत स्तर पर, जावा बहुत अधिक लचीले और कुशल टूल प्रदान करता है। इस लेख में, हम न केवल क्लासिक दृष्टिकोण को कवर करेंगे, बल्कि multi-catch, try-with-resources, कस्टम एक्सेप्शन बनाना और हैंडलिंग रणनीतियों जैसी आधुनिक सुविधाओं को भी शामिल करेंगे। यह सामग्री उन डेवलपर्स के लिए है जो पहले से ही जावा में आत्मविश्वास से लिखते हैं और अपने ज्ञान को गहरा करना चाहते हैं।
1. क्लासिक: try-catch-finally और इसकी बारीकियां
बुनियादी कंस्ट्रक्ट नींव बना हुआ है। हालांकि, उन्नत स्तर पर, यह समझना महत्वपूर्ण है कि यह अंदरूनी तौर पर कैसे काम करता है और अनुभवी प्रोग्रामर भी कौन सी गलतियाँ करते हैं।
फ़ाइल इनपुट/आउटपुट के साथ एक उदाहरण देखें:
import java.io.*;
public class ClassicExample { public static void main(String[] args) { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("file.txt")); String line = reader.readLine(); System.out.println(line); } catch (IOException e) { System.err.println("Read error: " + e.getMessage()); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { System.err.println("Close error: " + e.getMessage()); } } }}उन्नत स्तर के लिए मुख्य बिंदु:
- catch ब्लॉक का क्रम: अधिक विशिष्ट एक्सेप्शन पहले आने चाहिए। यदि आप
IOExceptionसे पहलेExceptionरखते हैं, तो कंपाइलर एक एरर देगा। - finally ब्लॉक हमेशा निष्पादित होता है, भले ही try या catch में
returnहो। यह संसाधनों को मुक्त करने के लिए महत्वपूर्ण है। - एक्सेप्शन सप्रेशन: यदि try और finally दोनों में एक्सेप्शन होता है, तो finally का एक्सेप्शन पहले वाले को "निगल" लेता है। इससे बचने के लिए,
Throwable.getSuppressed()का उपयोग करें।
2. मल्टी-कैच: सुंदरता और पठनीयता
जावा 7 से शुरू करके, एक ही catch ब्लॉक में कई एक्सेप्शन को संयोजित करना संभव हो गया। यह कोड डुप्लिकेशन को काफी कम करता है।
मल्टी-कैच के बिना, कोड बोझिल दिखता है:
try { // कोड जो IOException या SQLException फेंक सकता है} catch (IOException e) { logger.error("I/O error", e); throw new RuntimeException(e);} catch (SQLException e) { logger.error("Database error", e); throw new RuntimeException(e);}मल्टी-कैच के साथ, यह संक्षिप्त हो जाता है:
try { // कोड} catch (IOException | SQLException e) { logger.error("Resource error", e); throw new RuntimeException(e);}महत्वपूर्ण: मल्टी-कैच में वेरिएबल e final (या प्रभावी रूप से final) है। आप इसे कोई अन्य मान असाइन नहीं कर सकते। यह प्रकार सुरक्षा के लिए किया जाता है।
3. ट्राई-विथ-रिसोर्सेज: स्वचालित संसाधन प्रबंधन
संसाधन हैंडलिंग के लिए यह शायद सबसे शक्तिशाली सुधार है। यह उन संसाधनों को स्वचालित रूप से बंद करता है जो AutoCloseable (या Closeable) इंटरफ़ेस को लागू करते हैं।
ऊपर दिए गए क्लासिक उदाहरण से तुलना करें। try-with-resources के साथ यह इस प्रकार दिखता है:
import java.io.*;
public class TryWithResourcesExample { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader(new FileReader("file.txt")); BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
Strin