2015-11-04 10 views
8

Guava's ClassPath का उपयोग करके मैं एक विशिष्ट पैकेज में स्थित कक्षाओं को प्रारंभ करने की कोशिश कर रहा हूं, लेकिन मैं कन्स्ट्रक्टर को प्रारंभ करने के लिए उपयोग करना चाहता हूं क्योंकि अपवादों का प्रचार नहीं करता है।साइक्लिक इंटरफ़ेस त्रुटि का उपयोग करते समय orElseThrow

ClassPath.from(classLoader).getTopLevelClasses("test.package").stream() 
    .map(ClassPath.ClassInfo::load) 
    .map(Class::getConstructors) 
    .map(Arrays::stream) 
    .map(constructorStream -> constructorStream 
     .filter(constructor -> constructor.getParameterCount() == 0) 
     .findAny() 
     .orElseThrow(RuntimeException::new) 
    ); 

बहरहाल, यह एक त्रुटि InteliJ में बस चक्रीय इंटरफ़ेस बताते हुए देता है: तो यह है कि मैं क्या बाहर काम किया कंस्ट्रक्टर्स प्राप्त करने के लिए है। मुझे लगता है कि मुझे पता है कि एक चक्रीय इंटरफेस क्या है, लेकिन मुझे यकीन नहीं है कि इससे यह त्रुटि क्यों होगी। जहां तक ​​मुझे पता है कि रिटर्न टाइप के रूप में जाना जाता है (जो orElseThrow के लिए इस मामले में Constructor<?> के रूप में वापसी मूल्य है) तो एक अनचेक अपवाद फेंकना ठीक होना चाहिए। अगर मैं orElse(null) का उपयोग करता हूं तो त्रुटि दूर हो जाती है। यहाँ क्या चल रहा है और मैं रनटाइम अपवाद कैसे फेंक सकता हूं जिसे मैं फेंकना चाहता हूं?

+1

यदि आप विशिष्ट प्रकार के साथ 'orElseThrow' उपसर्ग करते हैं तो क्या होता है? '। orElseThrow (RuntimeException :: new)' – RealSkeptic

+0

त्रुटि हटा दी गई है और अब इरादे के अनुसार काम करता है। ऐसा क्यों? 'एक्स' पहले से ही उपलब्ध अपवाद द्वारा परिभाषित नहीं किया जाना चाहिए? – danthonywalker

+1

मुझे लगता है कि आप एक कंपाइलर का उपयोग कर रहे हैं जो टाइप अनुमान को बहुत कसकर नहीं करता है। ग्रहण में, यह स्पष्ट प्रकार तर्क के बिना काम करता है। ओरेकल के 'जावैक' में यह एक अपरिवर्तित अपवाद के बारे में शिकायत करता है। – RealSkeptic

उत्तर

0

रनटाइमप्शन नक्शा लैम्ब्डा के भीतर से फेंक दिया जाता है। स्ट्रीम अपी के अंदर एक्यूअल अपवाद को संभाला जा सकता है।

इससे बचने के लिए आप वर्तमान स्ट्रीम को अपने फ्लैटमैप विधि में प्रदान की गई संयुक्त धाराओं द्वारा प्रतिस्थापित करने के लिए flatMap विधि का उपयोग कर सकते हैं। धाराओं के संयोजन के दौरान आमतौर पर इसका उपयोग किया जाता है। यह भी देखें adam bien's example on flatmap.

इस उदाहरण में अपवाद स्ट्रीमिंग एपीआई के माध्यम से नहीं जाना है - ताकि आप चेक अपवादों का उपयोग भी कर सकें और स्ट्रीम इंटरफ़ेस में हस्ताक्षर से सीमित न हो, जिसमें कोई फेंक नहीं है।

ClassPath.from(classloader).getTopLevelClasses("test.package").stream() 
      .map(ClassPath.ClassInfo::load) 
      .map(Class::getConstructors) 
      .flatMap(Arrays::stream) 
      .filter(constructor -> constructor.getParameterCount() == 0) 
        .findAny() 
        .orElseThrow(RuntimeException::new); 
संबंधित मुद्दे