जावा 8 विधि संदर्भ: एक पैरामीटर को परिणामी आपूर्ति करने में सक्षम आपूर्तिकर्ता प्रदान करता है


259

मैं उपयोग करना चाहूंगा

java.util.Optional.orElseThrow()

एक अपवाद प्रकार के साथ जो एक निर्माण पैरामीटर के लिए पूछता है। कुछ इस तरह:

.orElseThrow(MyException::new(someArgument)) // obviously NOT working

क्या एक आपूर्तिकर्ता बनाने का एक तरीका है जो मेरे तर्क मूल्य को पारित करता है?


43
तुम क्यों नहीं कर सकते orElseThrow(() -> new MyException(someArgument))?
क्रिस्टोफर हैमरस्ट्रॉम 15

6
स्ट्रीम और वैकल्पिक अनुभव के साथ पेशेवर जावा प्रोग्रामर ... मैं अभी भी कभी-कभी यहां समाप्त होता हूं। और यही कारण है कि मैं कोटलिन पसंद करता हूं।
ड्रू स्टीफंस

जवाबों:



22

ऐसा प्रतीत होता है कि आप विधि से केवल RuntimeException को फेंक सकते हैं orElseThrow। अन्यथा आपको एक त्रुटि संदेश मिलेगा MyException cannot be converted to java.lang.RuntimeException

अद्यतन : - यह JDK के पुराने संस्करण के साथ एक समस्या थी। मैं इस मुद्दे को नवीनतम संस्करणों के साथ नहीं देखता हूं।


1
धन्यवाद, यह Optionalग्रूवी में उपयोग करते समय मुझे फेंक रहा था । throw Exceptionएक ग्रूवी क्लोजर से कोशिश कर रहा है , लेकिन यह java.lang.reflect.UndeclaredThrowableExceptionएक RuntimeExceptionतय समय में बदल गया ।
टेड नालेड

जिसके बारे में जानकर अच्छा लगा। सौभाग्य से मेरे मामले में, मैं RuntimeException का उपयोग कर रहा हूं, लेकिन यह हमेशा ऐसा नहीं हो सकता है।
hbobenicio

वर्ग के दस्तावेज़ीकरण के अनुसार गलत , Optional.orElseThrowजिसके लिए आप Throwableएक Errorया किसी भी साधन को फेंक सकते हैं Exception
बेसिल बोर्के

मुझे लगता है कि यह JDK 8 के पुराने संस्करण के साथ एक मुद्दा था।
मनु

@ मनु शायद आप इस सवाल पर चर्चा कर रहे हैं JDK-8047338 पर चर्चा करें, Optional.orElseThrow के साथ स्ट्रीम के अंदर RuntimeException फेंको । यदि हां, तो अपने उत्तर में शामिल करें। यदि यह स्पॉट-ऑन है या नहीं, तो मुझे यह समझने के लिए पर्याप्त कॉफी नहीं मिली है, इसलिए मैं आपके उत्तर को स्वयं संपादित करने से बचूंगा।
बेसिल बोर्के

10
optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));

मुझे त्रुटि मिल रही है "विधि orElseThrow (आपूर्तिकर्ता <; एक्स एक्स का विस्तार करता है) प्रकार में वैकल्पिक <QueryEntities> तर्कों के लिए लागू नहीं होता है () (> -> {})"
BdEnginex
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.