ओवरराइड करने के तरीके, ओवरराइड विधि की तुलना में व्यापक अपवादों को क्यों नहीं फेंक सकते?


104

मैं कैथे सिएरा की एससीजेपी 6 किताब से गुजर रहा था और ओवरराइड विधि में अपवादों को फेंकने के इस स्पष्टीकरण पर आया था। मैं काफी नहीं मिला। क्या कोई मुझे समझा सकता है?

ओवरराइडिंग विधि को उन अपवादों को नहीं फेंकना चाहिए जो ओवरराइड विधि द्वारा घोषित किए गए की तुलना में नए या व्यापक हैं। उदाहरण के लिए, एक विधि जो FileNotFoundException की घोषणा करती है, एक SQLException, अपवाद या किसी अन्य गैर-रनटाइम अपवाद की घोषणा करने वाली विधि द्वारा ओवरराइड नहीं की जा सकती, जब तक कि यह FileNotFoundException का उपवर्ग न हो।


1
यहाँ एक साइट है जो आपको मददगार मिल सकती है: javapractices.com/topic/TopicAction.do?Id=129
टिम बिश

जवाबों:


155

इसका मतलब यह है कि अगर कोई विधि किसी अपवाद को छोड़ने की घोषणा करती है, तो एक उपवर्ग में ओवरराइडिंग विधि केवल उस अपवाद या उसके उपवर्ग को फेंकने की घोषणा कर सकती है। उदाहरण के लिए:

class A {
   public void foo() throws IOException {..}
}

class B extends A {
   @Override
   public void foo() throws SocketException {..} // allowed

   @Override
   public void foo() throws SQLException {..} // NOT allowed
}

SocketException extends IOException, लेकिन SQLExceptionनहीं है।

यह बहुरूपता के कारण है:

A a = new B();
try {
    a.foo();
} catch (IOException ex) {
    // forced to catch this by the compiler
}

यदि आपने Bफेंकने का फैसला किया था SQLException, तो संकलक आपको इसे पकड़ने के लिए मजबूर नहीं कर सकता है, क्योंकि आप Bइसके सुपरक्लियर द्वारा उदाहरण की बात कर रहे हैं - A। दूसरी ओर, किसी भी उपवर्ग को IOExceptionउस हैंडल को पकड़ने (पकड़ने या फेंकने) द्वारा नियंत्रित किया जाएगाIOException

नियम है कि आप वस्तुओं को उनके सुपरक्लास द्वारा संदर्भित करने में सक्षम होने की आवश्यकता है, लिस्कोव सबस्टीट्यूशन सिद्धांत है।

चूंकि अनियंत्रित अपवाद कहीं भी फेंके जा सकते हैं, फिर वे इस नियम के अधीन नहीं हैं। यदि आप चाहते हैं, तो आप दस्तावेज़ के रूप में थ्रो क्लॉज़ में एक अनियंत्रित अपवाद जोड़ सकते हैं, लेकिन कंपाइलर इसके बारे में कुछ भी लागू नहीं करता है।


यह इंटरफेस लागू करते समय भी लागू होता है? मुझे यकीन नहीं है कि एक इंटरफ़ेस को लागू करने को अभी भी "ओवरराइडिंग" कहा जाता है।
मुहम्मद गालबाना

कैसे के बारे में @Override सार्वजनिक शून्य foo () {..} मुझे पता है कि इसकी अनुमति है लेकिन इस मामले के लिए स्पष्टीकरण स्पष्ट नहीं है।
नास्कर

4
@danip ओवरराइडिंग विधि किसी भी सबसेट को ओवरराइड विधि से फेंके गए अपवादों को फेंक सकती है। खाली सेट एक सबसेट भी है। इसीलिए @Override public void foo() {...}कानूनी है।
डेवलपर मारियस इलियानास

@Bozho ऐसा नहीं होना चाहिए अगर कोई विधि किसी दिए गए अपवाद को फेंकने की घोषणा करती है, तो एक उपवर्ग में ओवरराइडिंग विधि केवल उस अपवाद को या उसके उपवर्ग को फेंकने की घोषणा कर सकती है या सभी पर कोई फेंकता खंड घोषित नहीं कर सकती है
रमन साक्षी

तो असली दुनिया में कैसे पार पाया जाता है? मुझे एक कार्यान्वित इंटरफ़ेस से एक विधि को ओवरराइड करने की आवश्यकता है, लेकिन मेरे कार्यान्वयन में एक थ्रेड मंदी शामिल है, और इंटरफ़ेस नहीं है। यहां मानक प्रक्रिया क्या है?
एपी

22

ओवरराइडिंग विधि किसी भी अनियंत्रित (रनटाइम) अपवाद को फेंक सकती है, भले ही ओवरराइड विधि अपवाद को घोषित करे

उदाहरण:

class Super {
    public void test() {
        System.out.println("Super.test()");
    }
}

class Sub extends Super {
    @Override
    public void test() throws IndexOutOfBoundsException {
        // Method can throw any Unchecked Exception
        System.out.println("Sub.test()");
    }
}

class Sub2 extends Sub {
    @Override
    public void test() throws ArrayIndexOutOfBoundsException {
        // Any Unchecked Exception
        System.out.println("Sub2.test()");
    }
}

class Sub3 extends Sub2 {
    @Override
    public void test() {
        // Any Unchecked Exception or no exception
        System.out.println("Sub3.test()");
    }
}

class Sub4 extends Sub2 {
    @Override
    public void test() throws AssertionError {
        // Unchecked Exception IS-A RuntimeException or IS-A Error
        System.out.println("Sub4.test()");
    }
}

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

14

मेरी राय में, यह जावा सिंटैक्स डिज़ाइन में विफल है। बहुरूपता को अपवाद से निपटने के उपयोग को सीमित नहीं करना चाहिए। वास्तव में, अन्य कंप्यूटर भाषाएँ ऐसा नहीं करती हैं (C #)।

इसके अलावा, एक विधि को अधिक विशिष्ट उपवर्ग में ओवरराइड किया जाता है ताकि यह अधिक जटिल हो और, इस कारण से, नए अपवादों को फेंकने की अधिक संभावना है।


8

मैं यह उत्तर यहाँ पुराने प्रश्न के लिए प्रदान करता हूँ क्योंकि कोई उत्तर इस तथ्य को नहीं बताता है कि ओवरराइडिंग विधि यहाँ फिर से कुछ भी नहीं फेंक सकती है जो ओवरराइडिंग विधि फेंक सकती है:

1) उसी अपवाद को फेंक दो

public static class A 
{
    public void m1()
       throws IOException
    {
        System.out.println("A m1");
    }

}

public static class B 
    extends A
{
    @Override
    public void m1()
        throws IOException
    {
        System.out.println("B m1");
    }
}

2) ओवरराइड विधि के फेंके गए अपवाद के उपवर्ग को फेंक दें

public static class A 
{
    public void m2()
       throws Exception
    {
        System.out.println("A m2");
    }

}

public static class B 
    extends A
{
    @Override
    public void m2()
        throws IOException
    {
        System.out.println("B m2");
    }
}

3) कुछ भी नहीं फेंकना।

public static class A 
{   
    public void m3()
       throws IOException
    {
        System.out.println("A m3");
    }
}

public static class B 
    extends A
{   
    @Override
    public void m3()
        //throws NOTHING
    {
        System.out.println("B m3");
    }
}

4) फेंकता में RuntimeException होने की आवश्यकता नहीं है।

थ्रो में RuntimeException हो सकती है या नहीं, कंपाइलर इसकी शिकायत नहीं करेंगे। RuntimeException अपवादों की जाँच नहीं है। केवल जाँच किए गए अपवादों को फेंके नहीं जाने पर फेंके जाने की आवश्यकता होती है।


6

इसे समझने के लिए, इस पर विचार करें:

public interface FileOperation {
  void perform(File file) throws FileNotFoundException;
}

public class OpenOnly implements FileOperation {
  void perform(File file) throws FileNotFoundException {
    FileReader r = new FileReader(file);
  }
}

मान लीजिए आप तब लिखते हैं:

public class OpenClose implements FileOperation {
  void perform(File file) throws FileNotFoundException {
    FileReader r = new FileReader(file);
    r.close();
  }
}

यह आपको एक संकलन त्रुटि देगा, क्योंकि r.close () एक IOException को फेंकता है, जो FileNotFoundException की तुलना में व्यापक है।

इसे ठीक करने के लिए, यदि आप लिखते हैं:

public class OpenClose implements FileOperation {
  void perform(File file) throws IOException {
    FileReader r = new FileReader(file);
    r.close();
  }
}

आपको एक अलग संकलन त्रुटि मिलेगी, क्योंकि आप प्रदर्शन (...) ऑपरेशन को कार्यान्वित कर रहे हैं, लेकिन इंटरफ़ेस की परिभाषा में शामिल नहीं किए गए अपवाद को फेंकना।

यह महत्वपूर्ण क्यों है? खैर इंटरफेस के एक उपभोक्ता हो सकता है:

FileOperation op = ...;
try {
  op.perform(file);
}
catch (FileNotFoundException x) {
  log(...);
}

यदि IOException को फेंकने की अनुमति दी गई थी, तो क्लाइंट का कोड नोलॉन्जर सही है।

ध्यान दें कि यदि आप अनियंत्रित अपवादों का उपयोग करते हैं तो आप इस तरह के मुद्दे से बच सकते हैं। (मैं सुझाव नहीं दे रहा हूँ कि तुम करो या न करो, यह एक दार्शनिक मुद्दा है)


3

आइए हम एक साक्षात्कार प्रश्न करें। सुपरक्लास में NullPointerException को फेंकने वाली एक विधि है। क्या हम इसे RuntimeException को फेंकने वाली विधि से ओवरराइड कर सकते हैं?

इस प्रश्न का उत्तर देने के लिए, आइए जानते हैं कि एक अनियंत्रित और जाँच अपवाद क्या है।

  1. चेक किए गए अपवादों को स्पष्ट रूप से पकड़ा या प्रचारित किया जाना चाहिए जैसा कि बेसिक ट्राइ-कैच-एंड एक्सेप्शन हैंडलिंग में वर्णित है। अनियंत्रित अपवादों की यह आवश्यकता नहीं है। उन्हें पकड़ा या फेंका हुआ घोषित नहीं करना है।

  2. जावा में जाँच किए गए अपवाद java.lang.Exception वर्ग का विस्तार करते हैं। अनियंत्रित अपवाद java.lang.RuntimeException का विस्तार करते हैं।

सार्वजनिक वर्ग NullPointerException RuntimeException का विस्तार करता है

अनियंत्रित अपवाद java.lang.RuntimeException का विस्तार करते हैं। Thst क्यों NullPointerException एक Uncheked अपवाद है।

एक उदाहरण लेते हैं: उदाहरण 1:

    public class Parent {
       public void name()  throws NullPointerException {
           System.out.println(" this is parent");
       }
}

public class Child  extends Parent{
     public  void name() throws RuntimeException{
             System.out.println(" child ");
     }

     public static void main(String[] args) {
        Parent parent  = new Child();
        parent.name();// output => child
    }
}

कार्यक्रम सफलतापूर्वक संकलित करेगा। उदाहरण 2:

    public class Parent {
       public void name()  throws RuntimeException {
           System.out.println(" this is parent");
       }
}

public class Child  extends Parent{
     public  void name() throws  NullPointerException {
             System.out.println(" child ");
     }

     public static void main(String[] args) {
        Parent parent  = new Child();
        parent.name();// output => child
    }
}

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

    public class Parent {
       public void name()  throws IOException {
           System.out.println(" this is parent");
       }
}
public class Child  extends Parent{
     public  void name() throws IOException{
             System.out.println(" child ");
     }

     public static void main(String[] args) {
        Parent parent  = new Child();

        try {
            parent.name();// output=> child
        }catch( Exception e) {
            System.out.println(e);
        }

    }
}

कार्यक्रम सफलतापूर्वक संकलित करेगा। उदाहरण 4: जब चाइल्ड क्लास विधि बेस क्लास की समान विधि की तुलना में बॉर्डर चेक किए गए अपवाद को फेंक रही है।

import java.io.IOException;

public class Parent {
       public void name()  throws IOException {
           System.out.println(" this is parent");
       }
}
public class Child  extends Parent{
     public  void name() throws Exception{ // broader exception
             System.out.println(" child ");
     }

     public static void main(String[] args) {
        Parent parent  = new Child();

        try {
            parent.name();//output=> Compilation failure
        }catch( Exception e) {
            System.out.println(e);
        }

    }
}

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


2

आपको सुपर क्लास ए में विधि एम 1 थ्रिलिन ई 1 और क्लास बी ए के साथ ए 2 से एम 2 ओवरराइडिंग की विधि प्राप्त होती है। M2 E1 की तुलना में DIFFERENT या LESS SPECIALIZED कुछ भी नहीं फेंक सकता है।

बहुरूपता के कारण, क्लास ए का उपयोग करने वाला ग्राहक बी का इलाज करने में सक्षम होना चाहिए जैसे कि ए। इनहेरिटेंस ===> ई-ए (बी-ए-ए) है। क्या होगा अगर यह कोड कक्षा A से निपटने वाला अपवाद E1 संभाल रहा है, क्योंकि M1 घोषित करता है कि यह इस अपवाद को फेंकता है, लेकिन तब विभिन्न प्रकार के अपवाद को फेंक दिया गया था? यदि M1 IOException फेंक रहा था, तो अच्छी तरह से FileNotFoundException को फेंक सकता है, क्योंकि यह एक IOException है। ए के ग्राहक बिना किसी समस्या के इसे संभाल सकते थे। यदि अपवाद फेंका गया था, तो A के ग्राहकों को इस बारे में जानने का मौका नहीं मिलेगा और इसलिए इसे पकड़ने का मौका नहीं मिलेगा।


Perhac :: क्या यह चेक और अनचेक अपवाद दोनों के लिए सही है? या यह भिन्न होता है?
यज्ञसागर y

@ylnsagar यह केवल जाँच अपवादों के लिए है। अनियंत्रित अपवाद (RuntimeException के उपप्रकार) को 'प्रोग्रामर त्रुटियां' भी कहा जा सकता है और चूंकि सामान्य नियम को पकड़ने की कोशिश नहीं की जानी चाहिए, इसलिए उन्हें थ्रो क्लॉज में घोषित करने की आवश्यकता नहीं है। एक अनियंत्रित अपवाद बस इतना हो सकता है, किसी भी समय, किसी भी कोड से। उपरोक्त चर्चा केवल जाँच किए गए अपवादों के बारे में है
पीटर पेर्है

@Perhac :: हाँ आप सही हैं, लेकिन लेख पढ़कर मेरी समझ से। यह अनियंत्रित अपवादों के लिए भी सही है। उदाहरण के लिए यदि एक सुपर क्लास विधि नल ​​पॉइंटर अपवाद को फेंक रही है और यदि उप-विधि ओवरराइडिंग विधि अपवाद को फेंकती है। यहाँ अपवाद Null Pointer Exception का एक सुपर क्लास है। तब कंपाइलर इसकी अनुमति नहीं देगा।
यज्ञसागर

1

खैर java.lang.Exception java.lang.Throwable तक फैली हुई है। java.io.FileNotFoundException java.lang.Exception फैली हुई है। इसलिए यदि कोई विधि java.io.FileNotFoundException को फेंकता है, तो ओवरराइड विधि में आप FileNotFoundException की तुलना में पदानुक्रम से अधिक कुछ भी नहीं फेंक सकते हैं जैसे कि आप java.lang.Exception को नहीं फेंक सकते। आप हालांकि FileNotFoundException का एक उपवर्ग फेंक सकते हैं। हालाँकि आपको ओवरराइड विधि में FileNotFoundException को संभालने के लिए मजबूर किया जाएगा। कुछ कोड दस्तक और यह एक कोशिश दे दो!

नियम हैं, इसलिए आप विशिष्टता को चौड़ा करके मूल फेंकता घोषणा को नहीं खोते हैं, क्योंकि बहुरूपता का मतलब है कि आप सुपरक्लास पर ओवरराइड विधि को लागू कर सकते हैं।


1

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

उदाहरण:

class Super {
    public void throwCheckedExceptionMethod() throws IOException {
        FileReader r = new FileReader(new File("aFile.txt"));
        r.close();
    }
}

class Sub extends Super {    
    @Override
    public void throwCheckedExceptionMethod() throws FileNotFoundException {
        // FileNotFoundException extends IOException
        FileReader r = new FileReader(new File("afile.txt"));
        try {
            // close() method throws IOException (that is unhandled)
            r.close();
        } catch (IOException e) {
        }
    }
}

class Sub2 extends Sub {
    @Override
    public void throwCheckedExceptionMethod() {
        // Overriding method can throw no exception
    }
}

1

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

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

ध्यान दें कि सभी चेक किए गए अपवादों को संभाला जाता है या नहीं, इसकी जाँच संकलित समय पर की जाती है, न कि रनटाइम पर। इसलिए संकलित समय पर, जावा कंपाइलर अपवाद की जाँच करता है कि ओवरराइड विधि फेंक रहा है या नहीं। चूँकि ओवरराइड की गई विधि को केवल रनटाइम पर ही तय किया जा सकता है, इसलिए हम यह नहीं जान सकते हैं कि हमें किस प्रकार का अपवाद पकड़ना है।


उदाहरण

मान लीजिए कि हमारे पास वर्ग Aऔर उसके उपवर्ग हैं BAविधि m1और वर्ग Bने इस पद्धति को ओवरराइड कर दिया है (इसे m2भ्रम से बचने के लिए कॉल करते हैं ..)। अब कहते हैं कि m1फेंकता है E1, और m2फेंकता है E2, जो E1सुपरक्लास है। अब हम निम्नलिखित कोड लिखते हैं:

A myAObj = new B();
myAObj.m1();

ध्यान दें कि m1कुछ भी नहीं है m2, (फिर से, विधि हस्ताक्षर अतिभारित तरीकों में समान हैं इसलिए भ्रमित न हों m1और m2.. वे इस उदाहरण में अंतर करने के लिए हैं ... वे दोनों एक ही हस्ताक्षर हैं)। लेकिन संकलित समय पर, सभी जावा कंपाइलर संदर्भ प्रकार ( Aइस मामले में कक्षा ) में जाता है अगर यह मौजूद है और प्रोग्रामर से इसे संभालने की अपेक्षा करता है। तो जाहिर है, आप फेंक देंगे या पकड़ लेंगे E1। अब, रनटाइम पर, यदि ओवरलोड विधि फेंकता है E2, जो कि E1सुपरक्लास है, तो ... ठीक है, यह बहुत गलत है (उसी कारण से हम नहीं कह सकते हैं B myBObj = new A())। इसलिए, जावा इसकी अनुमति नहीं देता है। ओवरलोड विधि द्वारा फेंके गए अनियंत्रित अपवाद समान, उपवर्ग या गैर-मौजूद होने चाहिए।


वर्ग जनक {शून्य विधि () अनुक्रमणिकाOutOfBoundsException {System.out.println ("मूल विधि)"; }} क्लास चाइल्ड पैरेंट का विस्तार करता है {शून्य विधि () फेंकता है RuntimeException {System.out.println ("चाइल्ड मेथड"); } यदि पैरेंट क्लास रनटाइम अपवाद के बच्चे को फेंकता है और बच्चा रनटाइम अपवाद को खुद फेंकता है। क्या यह मान्य है?
abhiagNitk

1

इसे समझने के लिए आइए एक उदाहरण पर विचार करें जहां हमारे पास एक वर्ग है Mammalजो readAndGetविधि को परिभाषित करता है जो कुछ फ़ाइल पढ़ रहा है, उस पर कुछ ऑपरेशन कर रहा है और कक्षा का एक उदाहरण लौटाता है Mammal

class Mammal {
    public Mammal readAndGet() throws IOException {//read file and return Mammal`s object}
}

कक्षा का Humanविस्तार होता है Mammalऔर readAndGetउदाहरण के Humanबजाय उदाहरण की वापसी के लिए विधि को ओवरराइड करता है Mammal

class Human extends Mammal {
    @Override
    public Human readAndGet() throws FileNotFoundException {//read file and return Human object}
}

कॉल करने के लिए readAndGetहमें संभालना होगा IOExceptionक्योंकि इसका एक चेक किया हुआ अपवाद और स्तनपायी readAndMethodइसे फेंक रहा है।

Mammal mammal = new Human();
try {
    Mammal obj = mammal.readAndGet();
} catch (IOException ex) {..}

और हम जानते हैं कि संकलक के लिए mammal.readAndGet()वर्ग की वस्तु से कहा जाता रहा है Mammal, लेकिन कम से JVM का समाधान हो जाएगा क्रम mammal.readAndGet()वर्ग से एक कॉल करने के लिए विधि कॉल Humanक्योंकि mammalकर रहा है new Human()

विधि readAndMethodसे Mammalफेंक रहा है IOExceptionऔर क्योंकि यह एक जाँच अपवाद संकलक यह पकड़ने के लिए जब भी हम कहते हैं हमें बाध्य करेगा readAndGetपरmammal

अब मान लीजिए कि readAndGetमें Humanकिसी अन्य जाँच अपवाद जैसे अपवाद फेंक रहा है और हम जानते हैं readAndGetके कहने से कहा जाता हो जाएगी Humanक्योंकि mammalकर रहा है new Human()

क्योंकि कंपाइलर के लिए विधि से कॉल किया जा रहा है Mammal, इसलिए कंपाइलर हमें केवल हैंडल करने के लिए मजबूर करेगा, IOExceptionलेकिन रनटाइम में हमें पता है कि विधि Exceptionअपवाद को फेंक रही है जो संभाला नहीं जा रहा है और यदि विधि अपवाद को फेंकता है तो हमारा कोड टूट जाएगा।

इसीलिए इसे कंपाइलर स्तर पर ही रोका जाता है और हमें किसी भी नए या व्यापक जाँच अपवाद को फेंकने की अनुमति नहीं है क्योंकि यह अंत में JVM द्वारा संभाला नहीं जाएगा।

साथ ही अन्य नियम भी हैं जिनका हमें तरीकों को ओवरराइड करते समय पालन करने की आवश्यकता है और आप कारणों को जानने के लिए Why We should Follow Method Overriding Rules पर अधिक पढ़ सकते हैं ।


0

नीचे हम क्या स्पष्टीकरण देते हैं

class BaseClass {

    public  void print() {
        System.out.println("In Parent Class , Print Method");
    }

    public static void display() {
        System.out.println("In Parent Class, Display Method");
    }

}


class DerivedClass extends BaseClass {

    public  void print() throws Exception {
        System.out.println("In Derived Class, Print Method");
    }

    public static void display() {
        System.out.println("In Derived Class, Display Method");
    }
}

क्लास DerivedClass.java एक संकलित समय अपवाद फेंकता है जब प्रिंट विधि एक अपवाद, प्रिंट () बेसकलैस की विधि फेंकती है तो कोई अपवाद नहीं होता है

मैं इस तथ्य को यह बताने में सक्षम हूं कि अपवाद RuntimeException की तुलना में संकीर्ण है, यह या तो कोई अपवाद (रनटाइम त्रुटि), RuntimeException और उनके बच्चे अपवाद हो सकते हैं


0

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


0

जावा आपको मूल वर्ग में अपवादों को प्रतिबंधित करने का विकल्प दे रहा है , क्योंकि यह मान रहा है कि ग्राहक जो पकड़ा गया है उसे प्रतिबंधित करेगा । IMHO आपको अनिवार्य रूप से इस "सुविधा" का उपयोग नहीं करना चाहिए , क्योंकि आपके ग्राहकों को सड़क के लचीलेपन की आवश्यकता हो सकती है।

जावा एक पुरानी भाषा है जिसे खराब तरीके से डिज़ाइन किया गया है। आधुनिक भाषाओं में इस तरह के प्रतिबंध नहीं हैं। इस दोष के आसपास का सबसे आसान तरीका यह है कि आपका आधार वर्ग throw Exceptionहमेशा बना रहे। ग्राहक अधिक विशिष्ट अपवाद फेंक सकते हैं लेकिन अपने आधार वर्गों को वास्तव में व्यापक बना सकते हैं।


0

ओवरराइड विधियों पर जाँच और अनियंत्रित अपवादों को संभालने का नियम

- जब पैरेंट-क्लास विधि कोई अपवाद नहीं घोषित करती है, तो चाइल्ड-क्लास ओवरराइडिंग-मेथड घोषित कर सकता है ,

 1. No exception or
 2. Any number of unchecked exception
 3. but strictly no checked exception

-जब पैरेंट-क्लास विधि अनियंत्रित अपवाद घोषित करती है, तब चाइल्ड-क्लास ओवरराइडिंग-मेथड घोषित कर सकता है ,

 1. No exception or
 2. Any number of unchecked exception 
 3. but strictly no checked exception

- जब पैरेंट-क्लास विधि घोषित अपवाद की घोषणा करती है, तो चाइल्ड-क्लास ओवरराइडिंग-विधि घोषित कर सकती है ,

 1. No exception or
 2. Same checked exception or
 3. Sub-type of checked exception or
 4. any number of unchecked exception

उपरोक्त सभी निष्कर्ष सही हैं, भले ही माता-पिता की विधि में जाँच और अनियोजित अपवाद दोनों का संयोजन घोषित किया गया हो

संदर्भ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.