जावा रनटाइम त्रुटियों पर एक नज़र डालें

Feb 26 2023
जावा रनटाइम त्रुटियों का एक त्वरित अवलोकन · जावा में रनटाइम त्रुटियां क्या हैं? · रनटाइम त्रुटि बनाम संकलन-समय त्रुटि · रनटाइम त्रुटियों के प्रकार · रनटाइम त्रुटि कैसे दिखाई देती है? रनटाइम अपवाद नहीं पकड़ें · रनटाइम त्रुटि उदाहरण जावा में रनटाइम त्रुटियां क्या हैं? प्रोग्राम निष्पादन के समय होने वाली त्रुटियों को रनटाइम त्रुटियों के रूप में संदर्भित किया जाता है। संकलन के समय इस प्रकार की त्रुटियों का पता नहीं लगाया जा सकता है क्योंकि उनके सिंटैक्स में कुछ भी गलत नहीं है।

जावा रनटाइम त्रुटियों का एक त्वरित अवलोकन

· जावा में रनटाइम त्रुटियाँ क्या हैं?
· रनटाइम त्रुटि वी.एस. संकलन-समय त्रुटि
· रनटाइम त्रुटियों के प्रकार
· रनटाइम त्रुटि कैसे दिखाई देती है?
· क्या मुझे रनटाइम त्रुटियों को फेंकने की आवश्यकता है
· जब आप रनटाइम अपवादों को नहीं पकड़ते हैं तो क्या होता है
· रनटाइम त्रुटि उदाहरण

जावा में रनटाइम त्रुटियाँ क्या हैं?

प्रोग्राम निष्पादन के समय होने वाली त्रुटियों को रनटाइम त्रुटियों के रूप में संदर्भित किया जाता है। संकलन के समय इस प्रकार की त्रुटियों का पता नहीं लगाया जा सकता है क्योंकि उनके सिंटैक्स में कुछ भी गलत नहीं है। इसलिए रनटाइम त्रुटियां तब होती हैं जब प्रोग्राम बिना कोई त्रुटि दिए और ".class" फ़ाइल बनाए बिना सफलतापूर्वक संकलित हो जाता है। हालाँकि, प्रोग्राम ठीक से निष्पादित नहीं होता है। इन त्रुटियों का पता रनटाइम या प्रोग्राम के निष्पादन के समय लगाया जाता है।

जावा कंपाइलर रनटाइम त्रुटियों का पता नहीं लगाता है क्योंकि जावा कंपाइलर के पास इन त्रुटियों को पकड़ने के लिए कोई तकनीक नहीं है क्योंकि इसमें सभी रनटाइम जानकारी उपलब्ध नहीं है। प्रोग्राम चलने पर जावा वर्चुअल मशीन (जेवीएम) द्वारा रनटाइम त्रुटियों को पकड़ा जाता है ।

इन रनटाइम त्रुटियों को अपवाद कहा जाता है और वे त्रुटि विवरण देते हुए प्रोग्राम को असामान्य रूप से समाप्त कर देते हैं।

अपवाद रनटाइम पर फेंकी गई त्रुटियां हैं। इन रनटाइम त्रुटियों को संभालने के लिए हम जावा में अपवाद हैंडलिंग तकनीकों का उपयोग कर सकते हैं। अपवाद हैंडलिंग में, प्रोग्रामर को लगता है कि कोड का टुकड़ा त्रुटि उत्पन्न कर सकता है, कोशिश ब्लॉक के अंदर डाल दिया जाता है और प्रोग्रामर कैच ब्लॉक के अंदर त्रुटि को पकड़ सकता है।

रनटाइम त्रुटि वी.एस. संकलन-समय त्रुटि

एक संकलन-समय त्रुटि आम तौर पर उन त्रुटियों को संदर्भित करती है जो सिमेंटिक्स या सिंटैक्स से संबंधित होती हैं। एक रनटाइम त्रुटि उस त्रुटि को संदर्भित करती है जो हमें रनटाइम के दौरान कोड निष्पादन के दौरान मिलती है । हम कोड के विकास के दौरान संकलन-समय की त्रुटि को आसानी से ठीक कर सकते हैं। एक कंपाइलर रनटाइम त्रुटि की पहचान नहीं कर सकता है।

खोज

कोड के विकास के दौरान संकलक आसानी से संकलन-समय की त्रुटियों का पता लगा सकते हैं। एक संकलक रनटाइम त्रुटि का आसानी से पता नहीं लगा सकता है। इस प्रकार, हमें कोड के निष्पादन के दौरान इसकी पहचान करने की आवश्यकता है।

संदर्भ

एक संकलन-समय त्रुटि आम तौर पर उन त्रुटियों को संदर्भित करती है जो शब्दार्थ या सिंटैक्स के अनुरूप होती हैं। एक रनटाइम त्रुटि उस त्रुटि को संदर्भित करती है जो संकलक द्वारा नहीं पहचानी जाती है, लेकिन हम कोड निष्पादन (रनटाइम के दौरान) के दौरान उनका सामना करते हैं।

प्रभाव

कंपाइल-टाइम एरर शब्दार्थ या सिंटैक्स त्रुटियां हैं, वे कोड को चलने (संकलन) से रोकते हैं क्योंकि यह कुछ सिंटैक्स त्रुटियों का पता लगाता है। Wheares रनटाइम त्रुटियाँ कोड को पूर्ण निष्पादन से रोकती हैं।

फिक्सेशन

हम कोड के विकास के दौरान संकलन-समय की त्रुटि को आसानी से ठीक कर सकते हैं। एक संकलक रनटाइम त्रुटि की पहचान नहीं कर सकता है। लेकिन कोड के निष्पादन और पूर्व में कोड की पहचान के बाद हम इसे ठीक कर सकते हैं।

रनटाइम त्रुटियों के प्रकार

कई प्रकार की रनटाइम त्रुटियां हैं जिनका हम प्रोग्राम निष्पादन के समय सामना कर सकते हैं। कुछ अक्सर सामना की जाने वाली रनटाइम त्रुटियाँ नीचे सूचीबद्ध हैं:

डेटा प्रविष्टि त्रुटियां: इनपुट-आउटपुट त्रुटियां

ऐसे असंख्य तरीके हैं जिनसे उपयोगकर्ता इनपुट किसी एप्लिकेशन को दूषित कर सकता है।

HTML-आधारित टिप्पणी बोर्ड पर, एक उपयोगकर्ता जिसे मासूमियत से कम (<) या साइन (>) से अधिक अनएन्कोडेड सबमिट करने की अनुमति है, उस वेबपेज की रेंडर करने की क्षमता को पूरी तरह से बर्बाद करने की क्षमता रखता है। इसी तरह, ASCII प्रारूप में सभी इनपुट की अपेक्षा करने के लिए बनाए गए टेक्स्ट-प्रोसेसिंग सिस्टम समय से पहले समाप्त हो सकते हैं यदि वे इमोजी या गैर-मानक वर्ण इनपुट प्राप्त करते हैं।

अधिक नापाक रूप से, हैकर्स का एक पसंदीदा हमला वेक्टर SQL इंजेक्शन है , जो अन्यथा सहज इनपुट क्षेत्र के अंदर एक हानिकारक निष्पादन योग्य डेटाबेस क्वेरी को छुपाता है। यह न केवल एक एप्लिकेशन को विफल कर सकता है, बल्कि संभावित रूप से संपूर्ण डेटा स्तर के नियंत्रण को आत्मसमर्पण कर सकता है।

इनपुट सैनिटाइजेशन, या डेटा स्क्रबिंग की प्रक्रिया , डेटा के व्यापक स्पेक्ट्रम को परिवर्तित करती है जिसे संभावित रूप से अनुप्रयोगों में दर्ज किया जा सकता है, जो मूल्यों की एक सुरक्षित श्रेणी में होता है जिसे एक प्रोग्राम समझता है। ऐसे पुस्तकालयों का उपयोग इनपुट स्वच्छता विफलताओं के कारण होने वाली रनटाइम त्रुटियों को कम करने में मदद करता है।

Apache BVal और Hibernate Validator जैसे लोकप्रिय जावा फ्रेमवर्क सरल, एनोटेशन-आधारित इनपुट क्लींजिंग करते हैं, और वे किसी भी जावा-आधारित एप्लिकेशन में आसानी से एकीकृत होते हैं।

खराब तरीके से लागू किया गया तर्क

सिर्फ इसलिए कि कोड संकलन का मतलब यह नहीं है कि यह ठीक से काम करता है। कोड में अक्सर तार्किक समस्याएं होती हैं जो किसी एप्लिकेशन को रनटाइम पर विफल कर देती हैं।

जावा में सामान्य कोड से संबंधित रनटाइम त्रुटियों के एक वर्ग को संभालने के लिए एक अंतर्निहित निर्माण होता है, जिसे रनटाइम अपवाद या अनियंत्रित अपवाद कहा जाता है। जावा 17 अकेले एसडीके में ऐसी 78 त्रुटियों को परिभाषित करता है, और अन्य परियोजनाएं और ढांचे अतिरिक्त रूप से अपनी स्वयं की रनटाइम अपवाद त्रुटियों को परिभाषित करते हैं।

  • क्रम अपवाद
  • ArrayIndexOutOfBoundException
  • समवर्ती संशोधन अपवाद
  • क्लासकास्ट अपवाद
  • …

कम से कम, प्रत्येक एप्लिकेशन में एक सामान्य अपवाद हार्नेस शामिल होना चाहिए जो हर संभव रनटाइम अपवाद को पकड़ सकता है, त्रुटि को लॉग कर सकता है और पूरे एप्लिकेशन को निरस्त करने के बजाय निष्पादन के समस्याग्रस्त थ्रेड को मरने की अनुमति देता है।

अपर्याप्त रनटाइम संसाधन

सॉफ़्टवेयर डेवलपर होने वाली हर प्रकार की रनटाइम त्रुटि के लिए दोष नहीं देते हैं। जावा में कई रनटाइम त्रुटियों में अंतर्निहित आधारभूत संरचना के साथ समस्याओं के कारण संसाधन सीमाएं शामिल हैं। उदाहरणों में शामिल हैं: नेटवर्क टाइमआउट, स्मृति की स्थिति से बाहर , सीपीयू का अधिक उपयोग या प्रोसेसर पर थ्रेड शेड्यूल करने में असमर्थता।

संसाधन से संबंधित रनटाइम त्रुटियों से बचने का एक तरीका एक लोड परीक्षण उपकरण का उपयोग करना है, जैसे कि JMeter या LoadRunner, किसी एप्लिकेशन के CI/CD पाइपलाइन में। यदि ये उपकरण एक संभावित प्रदर्शन समस्या का पता लगाते हैं, तो वे उत्पादन परिनियोजन की ओर पाइपलाइन को और नीचे ले जाने से पहले एप्लिकेशन को रोक सकते हैं।

कुछ एप्लिकेशन का लोड बहुत अधिक भिन्न होता है। उदाहरण के लिए, एक वित्तीय सेवा ऐप अधिकांश समय स्थिर लोड देख सकता है लेकिन ट्रेडिंग दिन के अंत में बेहद व्यस्त हो सकता है। फाइलिंग की समय सीमा से पहले एक कर सेवा चरम भार पर पहुंच सकती है, लेकिन शेष वर्ष में अपेक्षाकृत कम भार होता है।

DevOps टीमों को संसाधनों से संबंधित रनटाइम त्रुटियों का पहले से पता लगाने और उन्हें कम करने के लिए उपकरणों के साथ अपने प्रदर्शन मेट्रिक्स की निगरानी करनी चाहिए। ऐसे उपकरणों के उदाहरणों में जेडीके फ्लाइट रिकॉर्डर और जावा मिशन कंट्रोल शामिल हैं ।

पूरी तरह से अप्रत्याशित कार्यभार वाले अनुप्रयोगों के लिए, संसाधनों को बड़े पैमाने पर आवंटित करने के लिए क्लाउड-आधारित लोड संतुलन तकनीक का उपयोग करें। यह कम आबंटित संसाधनों, और महंगे, शायद ही कभी इस्तेमाल किए जाने वाले हार्डवेयर खरीदने के जाल दोनों को समाप्त करता है।

बाहरी संसाधन विन्यास

एंटरप्राइज़ एप्लिकेशन शायद ही कभी एक पृथक बुलबुले में मौजूद होते हैं। वे आमतौर पर NoSQL डेटाबेस और रिलेशनल सिस्टम से लेकर काफ्का कतारों और RESTful APIs तक सब कुछ के साथ बातचीत करते हैं। दुर्भाग्य से, यदि आपका एप्लिकेशन एक आवश्यक, बाहरी सिस्टम से कनेक्ट करने में असमर्थ है, तो यह अनिवार्य रूप से रनटाइम त्रुटि का परिणाम है।

यदि निम्न में से कोई भी स्थिति कॉलिंग प्रोग्राम के लिए कोई संबंधित अद्यतन नहीं होने पर एक बाहरी संसाधन रनटाइम त्रुटि को दूर कर सकता है:

  • एक आईपी पता बदलता है;
  • साख परिवर्तन;
  • फ़ायरवॉल कॉन्फ़िगरेशन परिवर्तन; या
  • बाहरी प्रणाली रखरखाव के लिए नीचे जाती है।

संबंधित रूप से, अराजकता इंजीनियरिंग उपकरण उन प्रक्रियाओं को बेतरतीब ढंग से समाप्त कर देते हैं जिन पर एक आवेदन निर्भर करता है। ऐसे उपकरण डेवलपर्स को कोड लिखने के लिए मजबूर करते हैं जो बाहरी सिस्टम के विफल होने पर भी उत्तरदायी और लचीला बना रहता है।

बाहरी संसाधनों के साथ अंतर्निहित समस्या यह है कि डेवलपर्स उन्हें नियंत्रित नहीं कर सकते हैं - लेकिन वे नियंत्रित कर सकते हैं कि जब बाहरी संसाधन विफल हो जाते हैं तो कोई एप्लिकेशन कैसे प्रतिक्रिया करता है। आपके द्वारा नियंत्रित नहीं किए जाने वाले सिस्टम द्वारा उत्पन्न रनटाइम त्रुटियों की आशा करें, और ऐसे एप्लिकेशन लिखें जो उन बाहरी सिस्टमों के विफल होने पर शालीनता से प्रतिक्रिया दें।

तृतीय-पक्ष पुस्तकालय भेद्यताएँ

किसी भी गैर-तुच्छ उद्यम अनुप्रयोग में लॉगिंग, मॉनिटरिंग, इनपुट सत्यापन, फॉर्म हैंडलिंग और अधिक जैसे कार्य करने के लिए तृतीय-पक्ष पुस्तकालयों पर दर्जनों निर्भरताएँ शामिल हैं।

दुर्भाग्य से, तृतीय-पक्ष लाइब्रेरी में कोई भी बग आपके द्वारा परिनियोजित एप्लिकेशन में बग बन जाता है। यह दिसंबर 2021 में जावा दुनिया के लिए असुविधाजनक रूप से वास्तविक हो गया, क्योंकि व्यापक रूप से उपयोग किए जाने वाले Log4j 2 पुस्तकालय में LDAP इंजेक्ट दोष ने दुनिया भर में JVM को ऑफ़लाइन होने के लिए मजबूर कर दिया।

इस संभावना के खिलाफ कम करने का एक तरीका है कि सॉफ़्टवेयर निर्भरता अनुप्रयोगों में रनटाइम त्रुटियों को पेश करती है, केवल अपाचे या एक्लिप्स जैसे संगठनों से विश्वसनीय पुस्तकालयों का उपयोग करना है ।

एक अन्य सुरक्षात्मक उपाय यह है कि अपडेट उपलब्ध होते ही किसी एप्लिकेशन की निर्भरता को नवीनतम संस्करण में नियमित रूप से अपडेट किया जाए।

अंत में, द्वितीयक या तृतीयक निर्भरताओं के बारे में जागरूक रहें - वे जो आपकी प्राथमिक निर्भरताओं पर भरोसा करते हैं - और उनके साथ आने वाले किसी भी जोखिम से अवगत रहें।

सॉफ्टवेयर विकास की दुनिया में, "परिपूर्ण" "पूर्ण" का दुश्मन है। कोई भी प्रोग्राम अनपेक्षित रनटाइम त्रुटि के खतरे से सुरक्षित नहीं है। हालांकि, जब एंटरप्राइज़ डेवलपर्स संभावित कारणों के बारे में जागरूकता बढ़ाते हैं और संभावित खतरों को कम करने के लिए कदम उठाते हैं, तो वे सॉफ़्टवेयर बना सकते हैं जो रनटाइम त्रुटि का सामना करने की संभावना को कम करता है।

रनटाइम त्रुटि कैसे प्रकट होती है?

बधाई हो! यदि आपका कमांड प्रॉम्प्ट ऐसा दिखता है:

तब आपने अपने प्रोग्राम को जावा बाइटकोड में सफलतापूर्वक संकलित कर लिया है, जिसका अर्थ है कि आपके कोड के साथ कोई वाक्यात्मक समस्याएँ नहीं थीं! लेकिन, जैसा कि फ़ाइल नाम से पता चलता है, जब हम यह प्रोग्राम चलाते हैं:

हम अब रनटाइम त्रुटि में भाग गए हैं। रन टाइम त्रुटियां आमतौर पर तब होती हैं जब आपके कोड में तार्किक रूप से कुछ गलत होता है। यह दस्तावेज़ रनटाइम त्रुटियों को पढ़ने और ठीक करने का तरीका बताएगा।

यहाँ रनटाइम त्रुटि के प्रमुख भाग हैं

थ्रेड "मेन" में अपवाद : यह भाग अधिकांश रनटाइम त्रुटियों के लिए प्रकट होता है। यह सिर्फ आपको बताता है कि मुख्य विधि में अपवाद हुआ, जो हर समय होना चाहिए।

java.lang.ArrayIndexOutOfBoundsException: 5 : यह त्रुटि हुई है। त्रुटि के नाम से आम तौर पर आपको अंदाजा हो जाएगा कि क्या हुआ होगा। इस मामले में, हम जानते हैं कि यह सरणियों से संबंधित है और एक सरणी के लिए आवंटित स्थान से बाहर जा रहा है।

RunTimeErrors.main(RunTimeErrors.java:10) पर : इसे स्टैक ट्रेस कहा जाता है, जो आपको त्रुटि होने पर निष्पादित विधियों की सूची बताता है।

  • RunTimeErrors.main हमें बताता है कि यह त्रुटि RunTimeErrors वर्ग की मुख्य विधि में हुई।
  • RunTimeErrors.java:10 हमें बताता है कि यह किस फ़ाइल में हुआ और यह किस लाइन पर हुआ। इस मामले में, यह हमारी मुख्य कक्षा में लाइन 10 पर हुआ ।

कभी-कभी आपको यह तय करने के लिए एक जाँच करने की आवश्यकता होती है कि क्या रनटाइम अपवाद को फेंकना है यदि सिस्टम इसे अकेले नहीं कर सकता है, अक्सर IllegalArgumentException के साथ काम करते समय, लेकिन अधिकांश समय आपको जाँच करने की आवश्यकता नहीं होती है क्योंकि यह इसका हिस्सा है मानक रनटाइम जाँच जो जावा आपके लिए करता है।

एक उदाहरण के रूप में NullPointerException लेते हैं :

if(t == null) 
 throw new NullPointerException();

if(t != null) {
  // work with t reference
}

क्या होता है जब आप रनटाइम अपवाद नहीं पकड़ते हैं? चूंकि कंपाइलर इनके लिए अपवाद विनिर्देशों को लागू नहीं करता है, इसलिए यह काफी प्रशंसनीय है कि एक रनटाइम एक्सेप्शन पकड़े बिना आपकी मुख्य () विधि से सभी तरह से बाहर निकल सकता है। इस मामले में क्या होता है यह देखने के लिए, निम्न उदाहरण का प्रयास करें:

//: exceptions/NeverCaught.java 
// Ignoring RuntimeExceptions. 
// {ThrowsException} 
public class NeverCaught { 
 static void f() { 
 throw new RuntimeException("From f()"); 
 } 
 static void g() { 
 f(); 
 } 
 public static void main(String[] args) { 
 g(); 
 } 
} ///:~

Exception in thread "main" Java.lang.RuntimeException: From f() 
    at NeverCaught.f(NeverCaught.Java:7) 
    at NeverCaught.g(NeverCaught.Java:10) 
    at NeverCaught.main(NeverCaught.Java:13)

ध्यान रखें कि आपके कोडिंग में केवल RuntimeException (और उपवर्ग) प्रकार के अपवादों को अनदेखा किया जा सकता है, क्योंकि कंपाइलर सावधानीपूर्वक सभी चेक किए गए अपवादों को संभालने के लिए लागू करता है। तर्क यह है कि एक रनटाइम अपवाद प्रोग्रामिंग त्रुटि का प्रतिनिधित्व करता है, जो है:

एक त्रुटि जिसका आप अनुमान नहीं लगा सकते। उदाहरण के लिए, एक अशक्त संदर्भ जो आपके नियंत्रण से बाहर है।

एक त्रुटि जिसे एक प्रोग्रामर के रूप में आपको अपने कोड में जांचना चाहिए था (जैसे कि ArraylndexOutOfBoundsException जहां आपको सरणी के आकार पर ध्यान देना चाहिए था)। बिंदु #1 से होने वाला एक अपवाद अक्सर बिंदु के लिए एक समस्या बन जाता है

आप देख सकते हैं कि इस मामले में अपवादों का होना कितना बड़ा लाभ है, क्योंकि वे डिबगिंग प्रक्रिया में मदद करते हैं।

यह ध्यान रखना दिलचस्प है कि आप जावा अपवाद हैंडलिंग को एकल-उद्देश्य उपकरण के रूप में वर्गीकृत नहीं कर सकते। हां, यह उन अजीब रनटाइम त्रुटियों को संभालने के लिए डिज़ाइन किया गया है जो आपके कोड के नियंत्रण से बाहर की शक्तियों के कारण उत्पन्न होंगे, लेकिन यह कुछ प्रकार की प्रोग्रामिंग बगों के लिए भी आवश्यक है जिन्हें संकलक पहचान नहीं सकता है।

रनटाइम त्रुटि उदाहरण

public class Temp {
public static void main(String[] args) {
  Temp t = initT();
  
  t.foo("Hi");
  
 }
 private static Temp initT() {
  return null;
 }
 public void foo(String s) {
  System.out.println(s.toLowerCase());
 }
}

Exception in thread "main" java.lang.NullPointerException
	at Temp.main(Temp.java:7)

इस श्रेणी में अपवाद प्रकारों का एक पूरा समूह है। वे हमेशा जावा द्वारा स्वचालित रूप से फेंके जाते हैं और आपको उन्हें अपने अपवाद विनिर्देशों में शामिल करने की आवश्यकता नहीं है। सुविधाजनक रूप से पर्याप्त, वे सभी को एक साथ एक एकल आधार वर्ग के तहत रखा जाता है जिसे रनटाइम अपवाद कहा जाता है, जो वंशानुक्रम का एक आदर्श उदाहरण है: यह उन प्रकारों का एक परिवार स्थापित करता है जिनमें कुछ विशेषताएं और व्यवहार समान होते हैं। इसके अलावा, आपको यह कहते हुए अपवाद विनिर्देश लिखने की आवश्यकता नहीं है कि एक विधि RuntimeException (या RuntimeException से प्राप्त किसी भी प्रकार ) को फेंक सकती है, क्योंकि वे अनियंत्रित अपवाद हैं। क्योंकि वे बग इंगित करते हैं, आप आमतौर पर रनटाइम अपवाद नहीं पकड़ते हैं- यह स्वचालित रूप से निपटाया जाता है। अगर आपको रनटाइम अपवादों की जांच करने के लिए मजबूर किया गया था , तो आपका कोड बहुत गन्दा हो सकता है। भले ही आप आमतौर पर RuntimeExceptions को नहीं पकड़ते हैं, आप अपने खुद के पैकेज में कुछ RuntimeExceptions को फेंकना चुन सकते हैं ।

सबसे सामान्य रनटाइम अपवाद देखें

हैप्पी लर्निंग

Mouad Oumous Java WhatsApp Group JOIN में शामिल हों

Mouad Oumous टेलीग्राम चैनल JOIN से जुड़ें

इसे फॉलो करके हमारे प्रकाशन का समर्थन करें

स्प्रिंग बूट के साथ ग्राफक्यूएल सबसे आम जावा रनटाइम त्रुटियां स्प्रिंग बूट के साथ आरंभ करना: शुरुआती लोगों के लिए एक व्यापक ट्यूटोरियल आपके जीवन की गुणवत्ता में सुधार के 10 सरल लेकिन प्रभावी तरीके सबसे आम तौर पर पूछे जाने वाले Java8 स्ट्रीम आधारित साक्षात्कार प्रश्न - अंतिम भाग I एक किताब लिखकर $ 300 कमाएं 2 दिनों में - यहां बताया गया है कि जावा में एक्सेप्शन चेनिंग कैसे होती है एक्सेप्शन हैंडलिंग डेटाबेस इंटीग्रेशन के साथ एक सरल क्वार्कस प्रोजेक्ट कैसे बनाएं