कुछ कोड चलाने के लिए अज्ञात आंतरिक कक्षा का उपयोग करते समय जावा में अपवाद पारदर्शिता प्राप्त करने का सबसे अच्छा तरीका क्या है।अज्ञात आंतरिक कक्षाओं से चेक किए गए अपवादों को फेंकना
वास्तविक कोड में मैंने जो लगातार पैटर्न देखा है, वह कुछ छद्म रननेबल प्रकार इंटरफ़ेस का उपयोग कुछ दिए गए कोड के लिए कुछ संदर्भ निर्दिष्ट करने के लिए कर रहा है। जेडीके में सबसे अच्छा उदाहरण मैं सोच सकता हूं 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;
}
मुझे लगता है कि अनाम आंतरिक कक्षाएं, सामान्य रूप से, एक बुरा विचार है, मुख्य रूप से क्योंकि उन्हें पुन: उपयोग या विस्तारित नहीं किया जा सकता है। लेकिन यह एक और कारण है। मुझे भी किसी भी उत्तर में दिलचस्पी है। – user949300
http://blogs.sun.com/briangoetz/entry/exception_transparency_in_java – alexsmail
मैं परियोजना लैम्ब्डा के तहत ब्रायन के प्रस्ताव को देखा है पर एक नजर डालें, दुर्भाग्य से इस जावा में उपलब्ध नहीं है 6 – bluphoenix