2015-09-30 9 views
6

इस कोड के लिए उदाहरण के लिए:जावा 8 में जंजीर कथन में अपवाद की जांच करने या अपवादों की जांच करने का सही तरीका क्या है?

List<Class> classes = 
     Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") 
       .map(className -> Class.forName(className)) 
       .collect(Collectors.toList()); 

इस कोड को अब ठीक चलाता है। लेकिन, मान लीजिए कि हमारे पास स्ट्रीम में एक खाली सूची है और हमारे पास धारा में कई संचालन हैं। यह NullPointer अपवाद और आदि प्राप्त कर सकता है मुझे लगता है कि इस तरह के कथन के लिए प्रयास करना मुश्किल है। इसके लिए अपवाद को संभालने का सही तरीका क्या है?

+3

क्या? यदि यह खाली है, तो कुछ भी लागू नहीं किया जाएगा। पकड़ने की कोशिश? कहा पे? क्यूं कर? –

+1

आपका मतलब "धारा में खाली सूची" का क्या अर्थ है? आपका स्ट्रीम स्ट्रिंग का है, सूची नहीं। क्या आपका मतलब "स्ट्रीम में नल स्ट्रिंग" था? – Bohemian

उत्तर

7

आपको नल की जांच करने की आवश्यकता नहीं है। आप एक खाली धारा सभी कार्यों को छोड़ दिया जाएगा हों:,

List<Class<?>> classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") 
      .map(className -> { 
       try { 
        return Class.forName(className); 
       } catch (Exception e) { 
        throw new YourRuntimeException(); 
       } 
      }) 
      .collect(Collectors.toList()); 

यदि आप चाहते हैं अपवाद को नजरअंदाज किया जा करने के लिए तो मैं Optional रों को मैप करने के सुझाव देते हैं:

Stream.of("hello") 
     .filter(e => "world".equals(e)) // empties the stream 
     .foreach(System.out::println); // no NullPointer, no output 

अपवाद संचालन नक्शाकार में संभव है।

List<Class<?>> classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") 
      .map(className -> { 
       try { 
        return Optional.of(Class.forName(className)); 
       } catch (Exception e) { 
        return Optional.<Class<?>>empty(); 
       } 
      }) 
      .filter(Optional::isPresent) // ignore empty values 
      .map (Optional::get) // unwrap Optional contents 
      .collect(Collectors.toList()); 

कृपया यह भी जावा 8 धाराओं के साथ अधिक विस्तृत चर्चा के बारे में Class.forName संयोजन में के लिए How can I throw CHECKED exceptions from inside Java 8 streams? पर एक नजर है।

+2

न तो '=>' है। ध्यान दें कि तीन विकल्प, 'वैकल्पिक' पर मैपिंग, 'वैकल्पिक .isPresent' के माध्यम से फ़िल्टरिंग, और 'वैकल्पिक' को अनदेखा करना अनावश्यक रूप से जटिल है। एक 'फ्लैटमैप' ऑपरेशन कर सकता है। – Holger

4

आपका प्रश्न थोड़ा अजीब है। आप दावा कर रहे हैं कि "यह कोड अभी ठीक चलाता है" जबकि इसे संकलन-समय त्रुटियों को उत्पन्न करना चाहिए क्योंकि आप Class.forName द्वारा घोषित चेक अपवाद को प्रबंधित नहीं कर रहे हैं। इसके अलावा आप खाली सूचियों के बारे में बात कर रहे हैं, लेकिन आपके कोड में, कोई सूचियां शामिल नहीं हैं। यह आपके संदर्भ पर NullPointerException पर लागू होता है क्योंकि आपका कोड किसी भी स्थान पर null का उत्पादन नहीं करता है।

शायद, आप एक कोड के बारे में बात कर रहे हैं जो ClassNotFoundException पकड़ता है और इसे null लौटाकर इसे संभालता है। आपको यह कभी नहीं करना चाहिए। आप विफलताओं बाहर फ़िल्टर करना चाहते हैं, तो आप इसे इस तरह कर सकते हैं:

List<Class<?>> classes = 
    Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") 
     .flatMap(className -> { 
       try { 
        return Stream.of(Class.forName(className)); 
       } catch (ClassNotFoundException ex) { 
        // recommended: insert logging statement here 
        return Stream.empty(); 
       } 
      }) 
     .collect(Collectors.toList()); 

इस तरह, कोई तत्व एक अपवाद के मामले में उत्पन्न हो जाएगा और आप नीचे की ओर से निपटने के अतिरिक्त त्रुटि करने के लिए नहीं है।

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

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