2012-09-30 13 views
5

में अपवाद फेंकने के मानदंड क्या हैं जो अब तक मुझे पता है कि एक सुपरक्लास विधि को ओवरराइड करने पर उप-वर्ग को अपवाद के उप-अपवाद या उप-वर्ग को फेंकना चाहिए।सबक्लास

उदाहरण के लिए:

यह सही

class SuperClass { 
    public int doIt(String str, Integer... data)throws ArrayIndexOutOfBoundsException{ 
String signature = "(String, Integer[])"; 
System.out.println(str + " " + signature); 
return 1; 
} 
} 

public final class SubClass extends SuperClass { 
    public int doIt(String str, Integer... data) throws ArrayIndexOutOfBoundsException { 
     String signature = "(String, Integer[])"; 
     System.out.println("Overridden: " + str + " " + signature); 
     return 0; 
    } 

    public static void main(String... args) { 
     SuperClass sb = new SubClass(); 
     try { 
      sb.doIt("hello", 3); 
     } catch (Exception e) { 
     } 
    } 
} 

यह गलत

class SuperClass { 
    public int doIt(String str, Integer... data)throws ArrayIndexOutOfBoundsException{ 
String signature = "(String, Integer[])"; 
System.out.println(str + " " + signature); 
return 1; 
} 
} 

public final class SubClass extends SuperClass { 
    public int doIt(String str, Integer... data) throws Exception { 
     String signature = "(String, Integer[])"; 
     System.out.println("Overridden: " + str + " " + signature); 
     return 0; 
    } 

    public static void main(String... args) { 
     SuperClass sb = new SubClass(); 
     try { 
      sb.doIt("hello", 3); 
     } catch (Exception e) { 
     } 
    } 
} 

है लेकिन मेरा सवाल है, क्यों इस कोड ब्लॉक संकलक द्वारा सही माना जाता है ?

class SuperClass { 
    public int doIt(String str, Integer... data)throws ArrayIndexOutOfBoundsException{ 
String signature = "(String, Integer[])"; 
System.out.println(str + " " + signature); 
return 1; 
} 
} 

public final class SubClass extends SuperClass { 
    public int doIt(String str, Integer... data) throws RuntimeException { 
     String signature = "(String, Integer[])"; 
     System.out.println("Overridden: " + str + " " + signature); 
     return 0; 
    } 

    public static void main(String... args) { 
     SuperClass sb = new SubClass(); 
     try { 
      sb.doIt("hello", 3); 
     } catch (Exception e) { 
     } 
    } 
} 

उत्तर

5

ऐसा इसलिए है क्योंकि जावा में प्रत्येक विधि किसी भी समय RuntimeException (या Error) फेंक सकती है। इसे आपके विधि हस्ताक्षर के throws भाग में भी घोषित करने की आवश्यकता नहीं है। इसलिए एक अपवाद भी फेंकना संभव है जो आपके ओवरराइड विधि में घोषित एक सुपर प्रकार है, जब तक कि यह अभी भी उप प्रकार का RuntimeException है।

इस व्यवहार के लिए विनिर्देशन के लिए Chapter 11 (Exceptions) of the Java Language Specification देखें, विशेष रूप से 11.1.1. The Kinds of Exceptions जो जाँच परिभाषित करता है और अनियंत्रित (throws खंड में निर्दिष्ट करने की आवश्यकता नहीं है) अपवाद (throws खंड में निर्दिष्ट करने की आवश्यकता है)।

2

जब आप एक विधि को ओवरराइड, आप एक ही जांचे हुए अपवादों परिभाषित करना चाहिए। इस मामले में, SuperClass#doIt विधि घोषित करती है कि ArrayIndexOutOfBoundsException फेंकता है, इसलिए उस विधि को ओवरराइड करने वाले प्रत्येक बच्चे को उसी चेक अपवाद या उसके उप-वर्ग घोषित करना चाहिए।

और जानकारी:

+0

यह मतलब यह है घोषणा कर सकते हैं, एक क्रम अपवाद सुपर क्लास विधि से फेंक दिया जाता है, तो , अपवाद पदानुक्रम में किसी भी superclass फेंक दिया जा सकता है। –

+0

अपवाद -> रनटाइम अपवाद -> इंडेक्सऑटऑफबाउंड अपवाद -> ArrayIndexOutOfBoundException –

+0

हाँ, यह सही है। ओवरराइड में घोषित अपवाद अपने वंशज पेड़ में होना चाहिए, यह सुपर क्लास में घोषित अपवाद से बड़ा नहीं हो सकता है। –

1

यह सरल, RuntimeException और Errorthrows खंड में घोषित करने की जरूरत नहीं है बनाने की कोशिश करने के लिए, लेकिन हमेशा लगाए गए। यदि आप घोषणा में अंतर्निहित अपवाद शामिल करते हैं, तो आपकी सुपरक्लास विधि घोषणा लिखी जा सकती है;

public int doIt(String str, Integer... data) 
    throws ArrayIndexOutOfBoundsException, Error, RuntimeException { 

इसका मतलब है, उपवर्ग पद्धति पर स्पष्ट RuntimeException घोषणा सुपर क्लास विधि पर एक मौजूदा (निहित) अपवाद की एक उपवर्ग है, इसलिए इसकी अनुमति है।

0

सुपर वर्ग विधि किसी भी अपवाद की घोषणा नहीं करता है, तो उप वर्ग ओवरराइड प्रणाली की घोषणा नहीं कर सकते अपवाद "जाँच" लेकिन यह "अनियंत्रित" अपवाद

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