2013-05-11 10 views
10

ClassNotFoundException के पीछे कोई कारण अपवाद होने का कारण क्या है?क्लास नॉटफाउंड अपवाद का कारण एक अपवाद अपवाद

मैं समझने की कोशिश कर रहा हूं कि कक्षा को चेक अपवाद के रूप में क्यों नहीं माना जाता है, क्योंकि मेरा पूरा दिमाग मुझे बताता है कि इसे अनचेक किया जाना चाहिए।

उत्तर

6

रिसेवर आमतौर पर रिसीवर की जांच की जाती है रनटाइम पर समस्या को ठीक करने के लिए कुछ सार्थक कार्रवाई कर सकते हैं/चाहिए।

Unchecked Exceptions — The Controversy का कहना है:

यहाँ लब्बोलुआब यह दिशानिर्देश है: एक ग्राहक यथोचित, एक अपवाद से उबरने यह एक जाँच अपवाद बनाने के लिए उम्मीद की जा सकती है। यदि कोई ग्राहक अपवाद से पुनर्प्राप्त करने के लिए कुछ भी नहीं कर सकता है, तो इसे एक अनचेक अपवाद बनाएं।

ClassNotFoundException रों का सबसे सामान्य स्रोत

classLoader.loadClass(className); 

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

यह ClassNotFoundError के विपरीत जो सबसे अधिक बार एक प्रोग्राम है जो था स्थिर रनटाइम पर JVM के संयोजक द्वारा नहीं पाया जा सकता है जो अन्य वर्गों के साथ संकलित से परिणाम में है।

क्या चिंतनशील उपयोग के मामले (चयनित) एक विफलता से स्थिर संकलित कोड (रनटाइम त्रुटि) से जोड़ने के लिए अलग करता है?


प्रसंग

चिंतनशील: फोन करने वाले जानता है, जहां स्ट्रिंग से और क्यों लोड प्रयास किया गया था आया था।

स्टेटिक: कॉलर बस एक कक्षा का उपयोग करने की कोशिश कर रहा है जो संकलन समय पर उपलब्ध था। कोई संदर्भ उपलब्ध नहीं है।

रिकवरी

चिंतनशील: कोलर असफल ओवर कर सकते हैं एक अलग कार्यान्वयन करने के लिए या एक डिफ़ॉल्ट रणनीति की कोशिश करो।

स्टेटिक: जावा भाषा स्पष्ट रूप से विभिन्न लिंक बिंदुओं को प्रतिस्थापित करने का समर्थन नहीं करती है।

अलग ढंग से व्यक्त

चिंतनशील: कोलर अक्सर एक अलग तरह के लिए त्रुटि कन्वर्ट चाहिए deserialize करने में असफल रहने पर
एक IOException की तरह,।

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

4

ClassNotFoundException फेंक दिया जाता है जब आपका कोड कक्षा नाम पर Class.forName() पर कॉल करता है जिसे आपके एप्लिकेशन के क्लासपाथ (ढीले बोलने वाले) पर किसी वर्ग में हल नहीं किया जा सकता है। यह एप्लिकेशन के उपयोगकर्ता द्वारा प्रदान किया गया एक गलत वर्तनी वाला क्लासनाम हो सकता है, और इसलिए संभावित रूप से उपयोगकर्ता को इसकी रिपोर्ट करने का एक कारण है और यहां तक ​​कि एक सही वर्गनाम के साथ भी पुनः प्रयास करना संभव है। दूसरे शब्दों में यह एक पुनर्प्राप्ति योग्य त्रुटि हो सकता है ... कुछ परिस्थितियों में ... ताकि आप तर्क दे सकें कि इसे चेक करने का निर्णय उचित है।

किसी भी तरह से:

  • किसी भी पसंद का "शुद्धता" बनाम अनियंत्रित जाँच की जो बात की राय, नहीं उद्देश्य तथ्य, अतीत में
  • है, जावा डिजाइनरों कुछ गलत चुनाव किया है मामले, और
  • एक बार विकल्प बनने के बाद, पीछे की संगतता को तोड़ने के बिना वापस नहीं जा रहा है ...

इसके विपरीत, यदि आपको कक्षा लोडिंग/प्रारंभिक प्रक्रिया के दौरान कोई समस्या आती है, तो आपको NoClassDefFoundError प्राप्त होने की संभावना है। यह निश्चित रूप से वसूली योग्य नहीं है। जब ऐसा होता है तो आपके पास एक राज्य में एक या अधिक कक्षाएं होती हैं जहां वे JVM में मौजूद होते हैं लेकिन प्रारंभ या तत्काल नहीं किया जा सकता है। (यदि आप JVM अपना मनोनीत एंट्रीपॉइंट क्लास ढूंढने में विफल रहता है तो आपको NoClassDefFoundError भी दिखाई देगा। लेकिन यदि ऐसा होता है, तो आपके एप्लिकेशन को पुनर्प्राप्त करने का प्रयास भी नहीं मिलेगा ...)

+0

IMHO सबसे बड़ी गलती कर रहा था के रूप में कुछ अन्य कारणों के बारे में सोचा 'SQLException' जाँच की। – Bohemian

+0

@ बोहेमियन - मेरा पहला बुलेट बिंदु देखें :-) –

+0

मैं एक अंग पर बाहर जाऊंगा और कहूंगा कि यह इस मामले में एक तथ्य है। जब आप जेडीबीसी-कोड का उपयोग करते हैं, तो यह कोशिश-पकड़ने वाले ब्लॉक के साथ झुका हुआ है जो कभी भी उपयोग नहीं किया जाता है। कभी। जब आपके पास परफंक्शरी कोड के ओडल्स होते हैं, तो आप जानते हैं कि आपने एक डिज़ाइन गलत बना दिया है। – Bohemian

1

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

और जहां तक ​​मुझे पता है कि चेक अपवादों की अवधारणा केवल जावा में मौजूद है।

प्रश्न यह है कि प्रोग्राम क्लास नॉटफाउंड अपवाद से पुनर्प्राप्त हो सकता है?

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

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

अंत में निर्णय अपवाद के विकासकर्ता द्वारा किया जाता है और वह गलत या सही हो सकता है या हो सकता है मैं

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