2011-11-12 17 views
6

कुछ कोड चलाने के लिए अज्ञात आंतरिक कक्षा का उपयोग करते समय जावा में अपवाद पारदर्शिता प्राप्त करने का सबसे अच्छा तरीका क्या है।अज्ञात आंतरिक कक्षाओं से चेक किए गए अपवादों को फेंकना

वास्तविक कोड में मैंने जो लगातार पैटर्न देखा है, वह कुछ छद्म रननेबल प्रकार इंटरफ़ेस का उपयोग कुछ दिए गए कोड के लिए कुछ संदर्भ निर्दिष्ट करने के लिए कर रहा है। जेडीके में सबसे अच्छा उदाहरण मैं सोच सकता हूं java.security.PrivilegedExceptionAction है।

try { 
    boolean success = AccessController.doPrivileged(
     new PrivilegedExceptionAction<Boolean>() { 
      @Override 
      public Boolean run() throws Exception { 
       // do something 
       // read file 
       FileInputStream fileInputStream = 
        new FileInputStream(new File("someFile")); 
       return true; 
      } 
     } 
    ); 
} catch (PrivilegedActionException e) { 
    if (e.getCause() instanceof FileNotFoundException) { 
     // handle IO exception 
    } else { 
     // impossible no other checked exception 
    } 
} 

हालांकि कोड आप स्पष्ट रूप से देख सकते हैं भीतरी कोड केवल नहीं मिला एक फ़ाइल फेंकता है, लेकिन हम जांचे हुए अपवादों के लाभों को खो दिया है के रूप में फोन करने वाले क्या अपवाद वास्तव में फेंक दिया जाता है के बारे में पता है पढ़ने। एक आम बग अज्ञात आंतरिक वर्ग में कोड पेश करना होगा जो एक नया अपवाद फेंक देगा और कोड आपको उस अपवाद को संभालने के लिए मजबूर नहीं करेगा।

जो कुछ मैं चाहता हूं वह नीचे जैसा कुछ है, क्या इस प्रकार का व्यवहार भाषा परिवर्तन के बिना प्राप्त किया जा सकता है?

public interface PrivilegedExceptionAction<T,V... extends Throwable> 
{ 
    public T run() throws V; 
} 
+0

मुझे लगता है कि अनाम आंतरिक कक्षाएं, सामान्य रूप से, एक बुरा विचार है, मुख्य रूप से क्योंकि उन्हें पुन: उपयोग या विस्तारित नहीं किया जा सकता है। लेकिन यह एक और कारण है। मुझे भी किसी भी उत्तर में दिलचस्पी है। – user949300

+0

http://blogs.sun.com/briangoetz/entry/exception_transparency_in_java – alexsmail

+0

मैं परियोजना लैम्ब्डा के तहत ब्रायन के प्रस्ताव को देखा है पर एक नजर डालें, दुर्भाग्य से इस जावा में उपलब्ध नहीं है 6 – bluphoenix

उत्तर

3

मुझे नहीं लगता कि क्यों नहीं। निम्नलिखित कोड काम किया।

interface RunIt < E extends Exception > 
{ 
    void run () throws E ; 
} 

class App 
{ 
    public static void main (String [ ] args) 
    { 
     RunIt <RuntimeException> r = new RunIt <RuntimeException> () 
     { 
      public void run () 
      { 
       throw new RuntimeException () ; 
      } 
     } ; 
     r . run () ; 
    } 
} 
+0

यदि आपको एक से अधिक अपवाद फेंकने की आवश्यकता है तो आप क्या करेंगे? क्या आपके पास RunIt2 । मुझे लगता है कि यह सब बुरा नहीं है। मुझे यह चुनना होगा कि किस इंटरफ़ेस का उपयोग करने के लिए मैं किस अपवाद को अपनाने की उम्मीद कर रहा हूं। – bluphoenix

+0

यदि आपको एक से अधिक अपवाद फेंकने की आवश्यकता है, तो 2 विकल्प हैं। (1) जैसा कि आप कहते हैं कि ई 1 अपवाद बढ़ाता है, ई 2 अपवाद बढ़ाता है। (2) आप ई को सभी अपवादों का एक सुपर क्लास चुनने के लिए चुन सकते हैं जिन्हें फेंक दिया जा सकता है। यदि आप 1 चुनते हैं, तो इंटरफ़ेस RunIt कई प्रकार के चेक अपवादों की अनुमति देता है। (यदि आपकी आवश्यकता से अधिक हैं, तो आप अतिरिक्त को रनटाइम अपवाद पर सेट कर सकते हैं।) यदि आप अभ्यास के उद्देश्य को 2 तरह का पराजित करते हैं। यह एक अच्छा समाधान नहीं है, लेकिन यह काम करता है। – emory