कुछ लोग आपको यह समझाने की कोशिश करते हैं कि आपको नियमों से खेलना होगा। सुनो, लेकिन चाहे आप मानें, आपको अपनी स्थिति के आधार पर खुद फैसला करना चाहिए। वास्तविकता यह है कि "आप नियमों द्वारा खेलना चाहिए" ("आप नियमों द्वारा खेलना आवश्यक नहीं")। बस इस बात का ध्यान रखें कि यदि आप नियमों से नहीं खेलते हैं, तो इसके परिणाम हो सकते हैं।
स्थिति न केवल की स्थिति में लागू होती है Runnable
, बल्कि जावा 8 के साथ भी अक्सर धाराओं और अन्य स्थानों के संदर्भ में होती है जहां चेक किए गए अपवादों से निपटने की संभावना के बिना कार्यात्मक इंटरफेस पेश किए गए हैं। उदाहरण के लिए, Consumer
, Supplier
, Function
,BiFunction
और इतने पर सभी जांचे हुए अपवादों के साथ सौदा करने की सुविधा के बिना घोषित किया गया है।
तो क्या स्थितियां और विकल्प हैं? नीचे दिए गए पाठ में, Runnable
किसी भी कार्यात्मक इंटरफ़ेस का प्रतिनिधि है जो अपवादों की घोषणा नहीं करता है, या अपवादों को हाथ में उपयोग के मामले के लिए भी सीमित घोषित करता है।
- आपने
Runnable
खुद को कहीं घोषित किया है, और Runnable
किसी अन्य चीज़ से बदल सकते हैं।
Runnable
साथ बदलने पर विचार करें Callable<Void>
। मूल रूप से एक ही बात है, लेकिन अपवादों को फेंकने की अनुमति है; और return null
अंत में है, जो एक हल्के झुंझलाहट है।
Runnable
अपने स्वयं के रिवाज के साथ प्रतिस्थापित करने पर विचार करें जो @FunctionalInterface
वास्तव में उन अपवादों को फेंक सकते हैं जो आप चाहते हैं।
- आपने एक एपीआई का उपयोग किया है, और विकल्प उपलब्ध हैं। उदाहरण के लिए, कुछ जावा एपीआई अतिभारित हैं ताकि आप
Callable<Void>
इसके बजाय उपयोग कर सकें Runnable
।
- आपने एक एपीआई का उपयोग किया है, और कोई विकल्प नहीं हैं। उस स्थिति में, आप अभी भी विकल्पों से बाहर नहीं हैं।
- आप अपवाद को इसमें लपेट सकते हैं
RuntimeException
।
- आप अनियंत्रित कलाकारों का उपयोग करके अपवाद को एक RuntimeException में हैक कर सकते हैं।
आप निम्नलिखित की कोशिश कर सकते हैं। यह एक हैक का एक सा है, लेकिन कभी-कभी एक हैक वह है जो हमें चाहिए। क्योंकि, एक अपवाद की जाँच की जानी चाहिए या अनियंत्रित को इसके प्रकार से परिभाषित किया जाना चाहिए, लेकिन व्यावहारिक रूप से वास्तव में स्थिति द्वारा परिभाषित किया जाना चाहिए।
@FunctionalInterface
public interface ThrowingRunnable extends Runnable {
@Override
default void run() {
try {
tryRun();
} catch (final Throwable t) {
throwUnchecked(t);
}
}
private static <E extends RuntimeException> void throwUnchecked(Throwable t) {
throw (E) t;
}
void tryRun() throws Throwable;
}
मैं इसे अधिक पसंद करता हूं new RuntimeException(t)
क्योंकि इसमें एक छोटा स्टैक ट्रेस है।
अब आप कर सकते हैं:
executorService.submit((ThrowingRunnable) () -> {throw new Exception()});
अस्वीकरण: इस तरह अनियंत्रित कलाकारों के प्रदर्शन की क्षमता को वास्तव में जावा के भविष्य के संस्करणों में हटाया जा सकता है, जब जेनरिक प्रकार की जानकारी न केवल संकलन समय पर, बल्कि रनटाइम पर भी संसाधित होती है।