सबसे पहले, 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
में लिपटे पकड़े गए अपवादों को दोबारा डालें।
पूरी तरह से जवाब के लिए धन्यवाद। बहुत कुछ समझाने में मदद करता है, मेरे लिए काम किया। – Busch