2015-04-11 4 views
6

मान लीजिए हम एक वर्ग DynamicClass नामित किया है:कक्षा के अंदर MethodNotFoundException अपवाद को कैसे पकड़ें?

DynamicClass clazz = new DynamicClass(); 
clazz.getName(); 
clazz.getOther(); 
बेशक

, getName और getOther तरीकों में से बुला फेंकता MethodNotFoundException अपवाद:

public class DynamicClass { 

    public void get(String input) { 
     System.out.println(input); 
    } 

} 

अब, DynamicClass के निम्नलिखित instantiating कल्पना। हालांकि, मैं उत्सुक हूं, कक्षा के अंदर MethodNotFoundException अपवाद को पकड़ने का कोई तरीका है, यानी और get("Other") को और getOther() के कॉलिंग के कारण MethodNotFoundException अपवाद फेंकने के बजाय?

+1

कि जावा में नहीं होगा। लेकिन मुझे लगता है कि इस तरह की "डिफ़ॉल्ट" विधि को परिभाषित करना एक गतिशील भाषा जैसे ग्रोवी में संभव होगा: http://rosettacode.org/wiki/Respond_to_an_unknown_method_call#Groovy –

+1

क्या यह रनटाइम अपवाद होने की बजाय संकलन समय, त्रुटि नहीं है । कुछ विधि को बुलाओ जो वहां नहीं है ... !!!! आह, मुझे अभी तक @MarounMaroun के रूप में प्रतिबिंबों के बारे में पता नहीं था :(जानना अच्छा है, मैं कुछ नया पढ़ सकता हूं :-) –

+2

@nIcEcOw प्रतिबिंब का उपयोग करके यह कोई त्रुटि नहीं होगी। चीजें गतिशील हैं। – Maroun

उत्तर

0

this answer के संदर्भ के साथ, यह Java में सभी ध्यान में न आया अपवाद को पकड़ने के लिए संभव है:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread thread, Throwable throwable) { 
     // TODO 
    } 
}); 
0

क्यों नहीं?

try{ 
    clazz.getName(); 
    clazz.getOther(); 
}catch(MethodNotFoundException e){ 
    clazz.get("Name") 
} 

लेकिन वास्तव में नहीं लगता है कि यह अच्छा विचार है कि ...

+0

यह ओपी की तलाश नहीं है, वह प्रतिबिंब का जिक्र कर रहा है, कक्षा गतिशील है। उनका कोड सिर्फ समस्या का वर्णन करने के लिए है। – Maroun

+0

@MarounMaroun ओपी ने प्रतिबिंब का उपयोग करने के बारे में कुछ भी नहीं कहा है। – EJP

2

अच्छा जिज्ञासा।

मुझे डर है, जावा में प्रयास करने की कोशिश करने का कोई दूसरा तरीका नहीं है, लेकिन यदि जावा एक ओटीएफ (फ्लाई पर) कंपाइलर था और अपवाद तंत्र वास्तव में एक (if-responds_to?) विधि का उपयोग करता है जो होने की उम्मीद है क्लास विरासत के पदानुक्रम पिरामिड के शीर्ष पर घोषित किया गया उदाहरण के लिए जावा में ऑब्जेक्ट जो आपके डायनामिक क्लास पर उस विधि को ओवरराइड करना संभव होगा।

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

मुझे (Magik) नामक एक भाषा पता है जिसमें उपर्युक्त तंत्र है जो बहुत अच्छा है और यह एक ओटीएफ कंपाइलर है।

मैजिक में ऑब्जेक्ट क्लास के नाम के साथ एक विधि है_not_responds_to() और जब भी किसी ऑब्जेक्ट पर कोई संदेश भेजा जाता है तो इसे कक्षा के राज्यों और व्यवहारों के खिलाफ परीक्षण किया जाता है और आखिरकार चलाने के लिए उठाया जाता है या बेहतर होता है if_not_responds_to() विधि विधि का नाम (संदेश) अमान्य है।

यह do_not_responds_to को लागू करने के लिए एक बहुत ही साफ समाधान है? इससे पहले अपवाद को संभालने के लिए कक्षा (डायनामिक क्लास) में विधि। हालांकि मैजिक के साथ 10 वर्षों के प्रयोग के बाद, ऐसा करने की आवश्यकता नहीं थी।

क्षमा करें, मेरी अंग्रेजी अच्छी नहीं है, मुझे उम्मीद है कि मैं इस मुद्दे को समझा सकता हूं।

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