2015-10-27 3 views
5

मैं एक समारोह है कि प्रकार है कि आप में पारित के आधार पर एक अपवाद फेंकता बनाने के लिए कोशिश कर रहा हूँ।प्रतिबिंब के माध्यम से बनाए गए अपवाद वर्ग का उदाहरण कैसे फेंकते हैं?

private void myFunc(Class<?> exceptionType) { 
    ...do some work... 
    throw new exceptionOfTypeExceptionTypePassedIn(newMessage); 
} 

आप यह कर सकते हैं?

उत्तर

7

सबसे पहले, throw कथन केवल Throwable या इसके उपप्रकारों के संदर्भ अभिव्यक्तियों के साथ काम करता है। इसलिए, आपके द्वारा पारित अभिव्यक्ति आपके throw में उस प्रकार का होना चाहिए। exceptionType पैरामीटर के लिए बाध्य प्रदान करके आप इसे प्राप्त कर सकते हैं।

private void myFunc(Class<? extends Throwable> exceptionType) { 

आप अब Throwable उप-प्रकार के प्रकार को प्रतिबंधित करना चाहते हैं, तो आप ऐसा भी कर सकते हैं।

यदि यह Exception है, आप अगर यह RuntimeException है एक throws घोषणा

private void myFunc(Class<? extends Exception> exceptionType) throws Exception { 

जरूरत होगी, इसलिए

private void myFunc(Class<? extends RuntimeException> exceptionType) { 

आपको क्या चाहिए पर निर्भर करता है नहीं होगा, आप वास्तव में विधि सामान्य बना सकता है । यह तो इस तरह

private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T { 

वास्तविक प्रतिबिंब तर्क के रूप में, आप इस धारणा है कि इसी प्रकार एक सुलभ निर्माता है जो एक String तर्क स्वीकार करता है बना रहे हैं लगेगा। यदि ऐसा नहीं होता है, तो जावा अपने सभी प्रकार के अपवादों को फेंक देगा। आपको इन्हें संभालने की ज़रूरत है।

एक संभावित समाधान इस (javadocClass#getConstructor के लिए, javadocConstructor#newInstance के लिए) की तरह लग रहे हैं

private <T extends Throwable> void myFunc(Class<T> exceptionType) throws T { 
    final String message = "some message"; 
    try { 
     throw exceptionType.getConstructor(String.class).newInstance(message); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
     // rethrow 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
     // rethrow 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
     // rethrow 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
     // rethrow 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
     // rethrow 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
     // rethrow 
    } 
} 

आप स्पष्ट रूप से एक बहु पकड़ बयान में उन सभी प्रकार के अपवाद को संक्षिप्त कर सकते।

ध्यान दें कि यदि आपके द्वारा पारित अपवाद प्रकार मौजूदा catch कथन में उल्लिखित में से एक था, तो इसे निगल लिया जाएगा, यानी। फेंक नहीं आप उन सभी को throws में स्वयं भी घोषित कर सकते हैं।

private static <T extends Throwable> void myFunc(Class<T> exceptionType) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, T { 
    final String message = "some message"; 
    throw exceptionType.getConstructor(String.class).newInstance(message); 
} 

या RuntimeException में लिपटे पकड़े गए अपवादों को दोबारा डालें।

+0

पूरी तरह से जवाब के लिए धन्यवाद। बहुत कुछ समझाने में मदद करता है, मेरे लिए काम किया। – Busch

0

आप ऑब्जेक्ट पर newInstance विधि का उपयोग कर सकते हैं।

+1

'नया अपवाद OfTypeExceptionTypePassedIn (newMessage) दिया गया;', मुझे लगता है कि वे निर्माता को तर्क देने की कोशिश कर रहे हैं। –

+0

यह सही लगता है। –

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