ওভাররাইডিং পদ্ধতি কেন ওভাররাইড পদ্ধতির চেয়ে ব্যতিক্রমকে বড় আকারে ফেলে দিতে পারে না?


104

আমি ক্যাথে সিয়েরার এসসিজেপি 6 বইটি দিয়ে যাচ্ছিলাম এবং ওভাররাইড পদ্ধতিতে ব্যতিক্রম ছোঁড়ার এই ব্যাখ্যার মুখোমুখি হয়েছি। আমি বেশ পেলাম না। কেউ আমার কাছে তা ব্যাখ্যা করতে পারেন ?

ওভাররাইড পদ্ধতিতে ওভাররাইড পদ্ধতি দ্বারা ঘোষিতগুলির চেয়ে নতুন বা বিস্তৃত যাচাই করা ব্যতিক্রমগুলি অবশ্যই ছুঁড়ে দেওয়া উচিত নয়। উদাহরণস্বরূপ, একটি ফাইল যা ফাইলনটফাউন্ডএক্সসেপশনকে ঘোষণা করে এমন কোনও পদ্ধতি দ্বারা ওভাররাইড করা যাবে না যা কোনও এসকিএলএক্সসেপশন, ব্যতিক্রম বা অন্য কোনও রান-টাইম ব্যতিক্রম ঘোষণা না করে যদি না এটি ফাইলনটফাউন্ডএক্সেপশন এর সাবক্লাস হয়।


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

তাদের সুপারক্লাস দ্বারা অবজেক্টগুলি উল্লেখ করার জন্য আপনাকে যে নিয়মটি সক্ষম করতে হবে তা হ'ল লিসকভ সাবস্টিটিউশন নীতি।

যেহেতু চেক করা ব্যতিক্রমগুলি যে কোনও জায়গায় নিক্ষেপ করা যেতে পারে তবে সেগুলি এই নিয়মের অধীন নয়। আপনি চাইলে নথিভুক্তির ফর্ম হিসাবে থ্রো ক্লজটিতে একটি চেক করা ব্যতিক্রম যুক্ত করতে পারেন, তবে সংকলক এটি সম্পর্কে কিছুই প্রয়োগ করে না।


ইন্টারফেস প্রয়োগ করার সময় এটিও প্রযোজ্য? আমি নিশ্চিত নই যে কোনও ইন্টারফেস প্রয়োগ করার পরেও "ওভাররাইডিং" বলা হয়।
মুহাম্মদ জেলবানা

কীভাবে @ ওভাররাইড পাবলিক অকার্যকর foo () সম্পর্কে {..} আমি জানি এটি অনুমোদিত তবে এই মামলার ব্যাখ্যাটি পরিষ্কার নয়।
ন্যাসকার

4
ওভাররাইড পদ্ধতিতে অ্যানড্রাইড পদ্ধতিতে ওপেনড্রেন পদ্ধতিতে ফেলে দেওয়া ব্যতিক্রমগুলির কোনও উপসেট নিক্ষেপ করতে পারে। খালি সেটটিও একটি সাবসেট। এ কারণেই @Override public void foo() {...}আইনী।
বিকাশকারী মারিয়াস Žilėnas

@ বোঝো এমনটি হওয়া উচিত নয় যদি কোনও পদ্ধতি কোনও প্রদত্ত ব্যতিক্রম ছুঁড়ে দেওয়ার ঘোষণা করে তবে সাবক্লাসের ওভাররাইডিং পদ্ধতিটি কেবল সেই ব্যতিক্রম বা তার সাবক্লাসটি ফেলে দেওয়ার বা
রমন সাহসী

তাহলে বাস্তব বিশ্বে কীভাবে পরাভূত হবে? আমি একটি বাস্তবায়িত ইন্টারফেস থেকে একটি পদ্ধতি ওভাররাইড করা প্রয়োজন, কিন্তু আমার বাস্তবায়ন একটি নিক্ষেপ ক্ষয় অন্তর্ভুক্ত, এবং ইন্টারফেস এর না। এখানে স্ট্যান্ডার্ড পদ্ধতি কী?
এপি

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()");
    }
}

আপনার ইন্টারফেসটি সাবক্লাসের মতো একটি রানটাইম ব্যতিক্রম ঘোষণা না করলে আপনি কীভাবে কোনও ত্রুটি বা সতর্কতা জোর করবেন? ডকুমেন্টেশনের উদ্দেশ্যে আমি ধারাবাহিকতা জোর করার চেষ্টা করছি। ইন্টারফেস প্রকারটি সমস্ত ব্যতিক্রম, চেক করা এবং চেক করা ছাড়াই পরীক্ষা করা আরও সহজ rather
anon58192932

14

আমার মতে এটি জাভা সিনট্যাক্স ডিজাইনে ব্যর্থ। পলিমারফিজম ব্যতিক্রম হ্যান্ডলিংয়ের ব্যবহার সীমাবদ্ধ করা উচিত নয়। আসলে, অন্যান্য কম্পিউটারের ভাষা এটি করে না (সি #)।

তদুপরি, একটি পদ্ধতি আরও বেশি বিশেষায়িত সাবক্লাসে ওভাররেড করা হয় যাতে এটি আরও জটিল এবং এই কারণে নতুন ব্যতিক্রম ছোঁড়ার সম্ভাবনা বেশি।


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) নিক্ষেপগুলিতে রানটাইম এক্সেকশন থাকা প্রয়োজন হয় না।

নিক্ষেপগুলিতে রানটাইম এক্সেকশন থাকতে পারে বা না, সংকলক এটি সম্পর্কে অভিযোগ করবে না। রানটাইম এক্সেপশনগুলি ব্যতিক্রমগুলি চেক করা হয় না। যদি ধরা না থাকে তবে কেবলমাত্র চেক করা ব্যতিক্রমগুলি থ্রোতে উপস্থিত হওয়া প্রয়োজন।


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 () একটি আইওএক্সেপশন ছুঁড়ে দেয় যা ফাইলনটফাউন্ডএক্সেপশন থেকে আরও বিস্তৃত।

এটি ঠিক করার জন্য, আপনি যদি লিখেন:

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(...);
}

যদি আইওএক্সেপশন নিক্ষেপ করার অনুমতি দেওয়া হয় তবে ক্লায়েন্টের কোডটি সঠিক নয়।

মনে রাখবেন যে আপনি যদি চেক না করা ব্যতিক্রমগুলি ব্যবহার করেন তবে আপনি এই ধরণের সমস্যা এড়াতে পারবেন। (আমি আপনাকে করণীয় বা না করার পরামর্শ দিচ্ছি না, এটি দার্শনিক সমস্যা)


3

আমাদের একটি সাক্ষাত্কার প্রশ্ন করা যাক। এমন একটি পদ্ধতি রয়েছে যা সুপারক্লাসে নলপয়েন্টারএক্সসেপশন ছুড়ে দেয়। রানটাইম এক্সসেপশনকে ছুঁড়ে এমন কোনও পদ্ধতি দিয়ে কী আমরা এটিকে ওভাররাইড করতে পারি?

এই প্রশ্নের উত্তর দিতে, আসুন জেনে নেওয়া যাক একটি চেক না করা এবং চেক করা ব্যতিক্রম কী।

  1. বেসিক ট্রাই-ক্যাচ-অবশেষে এক্সেপশন হ্যান্ডলিং-এ বর্ণিত হিসাবে পরীক্ষিত ব্যতিক্রমগুলি অবশ্যই স্পষ্টভাবে ধরা বা প্রচার করতে হবে। চেক করা ব্যতিক্রমগুলির এই প্রয়োজনীয়তা নেই। তাদের ধরা বা ছুঁড়ে ফেলার ঘোষণা করতে হবে না।

  2. জাভাতে চেক করা ব্যতিক্রম java.lang.Exception ক্লাসটি প্রসারিত করে। চেক করা ব্যতিক্রমগুলি জাভা.এল.আং.রুনটাইম এক্সসেপশনকে প্রসারিত করে।

পাবলিক ক্লাস নালপয়েন্টার এক্সসেপশন রানটাইম এক্সেপশন প্রসারিত করে

চেক করা ব্যতিক্রমগুলি জাভা.এল.আং.রুনটাইম এক্সসেপশনকে প্রসারিত করে। নালপয়েন্টার এক্সসেপশন কেন একটি চেনা ব্যতিক্রম Th

আসুন একটি উদাহরণ নেওয়া যাক: উদাহরণ 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
    }
}

প্রোগ্রামটি সফলভাবে সংকলন করবে। সুতরাং এটি স্পষ্ট যে চেক করা ব্যতিক্রম ক্ষেত্রে কিছুই হয় না nothing এখন, আসুন একবার দেখে নেওয়া যাক চেক করা ব্যতিক্রমগুলির ক্ষেত্রে কী ঘটে। উদাহরণ 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 ওভাররাইডিং এম 1 সহ এ থেকে প্রাপ্ত বর্গ বি রয়েছে। এম 2 ই 1 এর চেয়ে আলাদা বা কম বিশেষ কিছু ফেলে দিতে পারে না।

পলিমারফিজমের কারণে, ক্লাস এ ব্যবহার করে ক্লায়েন্টটি বি এর মতো আচরণ করতে সক্ষম হবে যেমন এ। ইনহারিটেন্স ===> ইস-এ (বি হচ্ছে-এ)) যদি ক্লাস এ-এর সাথে আচরণকারী এই কোডটি ব্যতিক্রম E1 পরিচালনা করছে, এম 1 হিসাবে ঘোষণা করা হয়েছে যে এটি এই চেক করা ব্যতিক্রম ছুঁড়ে ফেলেছে, তবে বিভিন্ন ধরণের ব্যতিক্রম নিক্ষেপ করা হয়েছিল? যদি এম 1 আইওএক্সেপশন নিক্ষেপ করছিল তবে এম 2 ফাইল-নটফাউন্ডএক্সসেপশনটি ভালভাবে ফেলতে পারে, কারণ এটি আইওএক্সেপশন। এ এর ক্লায়েন্টরা কোনও সমস্যা ছাড়াই এটি পরিচালনা করতে পারে। যদি ফেলে দেওয়া ব্যতিক্রমটি আরও বিস্তৃত হয় তবে এ এর ​​ক্লায়েন্টদের এটি সম্পর্কে জানার সুযোগ থাকবে না এবং তাই এটি ধরার সুযোগ থাকবে না।


পারহ্যাক :: চেক করা এবং নির্বাচন ব্যতীত উভয় ক্ষেত্রেই এটি সত্য? বা এটি পৃথক হয়?
ইলনসাগর

@ সাইনসাগর এটি কেবল পরীক্ষিত ব্যতিক্রমগুলির জন্য। চেক না করা ব্যতিক্রম (রানটাইম এক্সেপশন এর সাব টাইপস) কেও 'প্রোগ্রামার ত্রুটি' বলা যেতে পারে এবং সাধারণ নিয়ম হিসাবে চেষ্টা করা উচিত নয়, তাই থ্রোস ক্লোজে ঘোষিত হওয়ার দরকার নেই। একটি চেক না করা ব্যতিক্রম কোনও কোড থেকে ঠিক যে কোনও সময় ঘটতে পারে। উপরের আলোচনাটি কেবল পরীক্ষিত ব্যতিক্রমগুলি সম্পর্কিত
পিটার পেরে

@ পেরাহাক :: হ্যাঁ আপনি ঠিক বলেছেন, তবে নিবন্ধগুলি পড়ে আমার বোঝার থেকে। এটি চেক করা ব্যতিক্রমগুলির জন্যও সত্য। উদাহরণস্বরূপ, যদি একটি সুপার শ্রেণীর পদ্ধতি নাল পয়েন্টার ব্যতিক্রম ছুঁড়ে ফেলছে এবং যদি পদ্ধতিটি ওভাররাইড করে সাবক্লাসটি ব্যতিক্রম ছোঁড়ে। এখানে ব্যতিক্রম নুল পয়েন্টার ব্যতিক্রম একটি সুপার ক্লাস। তারপর সংকলক এটি অনুমতি দেয় না।
ইলনসাগর

1

ওয়েল java.lang.Exception java.lang.Trrowable প্রসারিত। java.io.FileNotFoundException java.lang.Exception প্রসারিত করে। সুতরাং যদি কোনও পদ্ধতি java.io.FileNotFoundException নিক্ষেপ করে তবে ওভাররাইড পদ্ধতিতে আপনি ফাইলনটফাউন্ডএক্সেপশনের তুলনায় উচ্চতর কিছু উপরে ফেলতে পারবেন না যেমন আপনি java.lang.Exception নিক্ষেপ করতে পারবেন না। আপনি যদিও ফাইলনটফাউন্ডএক্সসেপ্টের একটি সাবক্লাস নিক্ষেপ করতে পারেন। তবে আপনি ওভারডেন পদ্ধতিতে ফাইলনটফাউন্ডএক্সসেপশন পরিচালনা করতে বাধ্য হবেন। কিছু কোড নক করুন এবং এটি ব্যবহার করে দেখুন!

বিধিগুলি এখানে রয়েছে যাতে আপনি নির্দিষ্টতা প্রশস্ত করে মূল নিক্ষেপ ঘোষণাকে হারাবেন না, কারণ পলিমারফিজমের অর্থ আপনি সুপারক্লাসে ওভারডিডেন পদ্ধতিটি শুরু করতে পারেন।


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())। সুতরাং, জাভা এটি অনুমতি দেয় না। অতিরিক্ত লোড পদ্ধতিতে ছোঁড়া চেক করা ব্যতিক্রমগুলি অবশ্যই একই, উপশ্রেণী বা অ-অস্তিত্ব থাকতে হবে।


ক্লাস প্যারেন্ট {অকার্যকর পদ্ধতি () সূচি ছুড়ে দেয় সূচিপত্র আউটফাউন্ডস এক্সেকশন {System.out.println ("প্যারেন্ট পদ্ধতি"); }; শ্রেণি শিশু পিতামাতার oid শূন্য পদ্ধতিতে প্রসারিত করে () রানটাইম এক্সেকশন th System.out.println ("শিশু পদ্ধতি") নিক্ষেপ করে; Parent যদি পিতামাতার ক্লাসটি রানটাইম ব্যতিক্রমের কোনও শিশুকে ছুড়ে ফেলে এবং শিশু রানটাইম ব্যতিক্রম নিজেই ফেলে দেয়। এটা কি বৈধ?
abhiagNitk

1

এটি বোঝার জন্য আসুন আমরা একটি উদাহরণ বিবেচনা করি যেখানে আমাদের একটি ক্লাস রয়েছে Mammalযা readAndGetপদ্ধতিটি সংজ্ঞায়িত করে যা কিছু ফাইল পড়ছে, এটিতে কিছু অপারেশন করছে এবং শ্রেণীর উদাহরণ ফিরিয়ে আনছে Mammal

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

শ্রেণীর উদাহরণ পরিবর্তে উদাহরণটি ফেরত দিতে Humanশ্রেণি ক্লাস Mammalএবং ওভাররাইড readAndGetপদ্ধতিকে প্রসারিত করে ।HumanMammal

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তবে রানটাইম জেভিএম mammal.readAndGet()ক্লাসের একটি কল করার পদ্ধতি কলটি সমাধান করবে Humanকারণ mammalহোল্ডিং রয়েছে new Human()

পদ্ধতি readAndMethodথেকে Mammalনিক্ষেপ করা হয় IOExceptionএবং কারণ এটি একটি পরীক্ষিত ব্যতিক্রম কম্পাইলার এটা ধরতে যখনই আমরা কল আমাদের বাধ্য করা হবে readAndGetউপরmammal

এখন অনুমান করা readAndGetমধ্যে Humanঅন্য কোন পরীক্ষিত ব্যতিক্রম যেমন ব্যতিক্রম নিক্ষেপ করা হয় এবং আমরা জানি readAndGetদৃষ্টান্ত থেকে বলা হবে Human, কারণ mammalধারণ করা হয় new Human()

কারণ সংকলকটির জন্য পদ্ধতিটি কল করা হচ্ছে Mammal, সুতরাং সংকলকটি কেবলমাত্র আমাদের পরিচালনা করতে বাধ্য করবে IOExceptionকিন্তু রানটাইমের সময় আমরা জানি যে পদ্ধতিটি Exceptionব্যতিক্রম ছুঁড়ে ফেলবে যা হ্যান্ডেল হচ্ছে না এবং পদ্ধতিটি ব্যতিক্রম ছুঁড়ে দিলে আমাদের কোডটি ভেঙে যাবে।

এ কারণেই এটি সংকলক স্তরে নিজেই প্রতিরোধ করা হয়েছে এবং আমাদের কোনও নতুন বা বিস্তৃত চেক করা ব্যতিক্রম ছোঁড়ার অনুমতি নেই কারণ এটি শেষ পর্যন্ত জেভিএম দ্বারা পরিচালিত হবে না।

অন্যান্য নিয়মগুলিও রয়েছে যেগুলি পদ্ধতিগুলি ওভাররাইড করার সময় আমাদের অনুসরণ করা উচিত এবং এর কারণগুলি জানতে আমাদের কেন পদ্ধতির ওভাররাইডিং নিয়মগুলি অনুসরণ করা উচিত সে সম্পর্কে আরও পড়তে পারেন ।


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");
    }
}

ক্লাস ডেরিভডক্লাস.জভা একটি সংকলন সময় ব্যতিক্রম ছুঁড়ে দেয় যখন মুদ্রণ পদ্ধতিটি একটি ব্যতিক্রম ছোঁড়ে, বেসক্লাসের মুদ্রণ () পদ্ধতিটি কোনও ব্যতিক্রম ছুঁড়ে না ফেলে

আমি এটিকে দায়ী করতে সক্ষম হচ্ছি যে ব্যতিক্রমটি রানটাইম এক্সেকশনের চেয়ে সংক্ষিপ্ত, এটি কোনও ব্যতিক্রম (রানটাইম ত্রুটি), রানটাইম এক্সেকশন এবং তাদের শিশু ব্যতিক্রম হতে পারে can


0

সাবক্লাসের ওভাররাইড পদ্ধতিটি কেবল একাধিক পরীক্ষিত ব্যতিক্রমগুলি ছুঁড়ে ফেলতে পারে যা সুপারক্লাসের পদ্ধতির চেক করা ব্যতিক্রমের সাবক্লাস, তবে সুপারক্লাসের পদ্ধতির চেক করা ব্যতিক্রম সম্পর্কিত নয় এমন একাধিক পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলতে পারে না


0

জাভা আপনাকে অভিভাবক শ্রেণিতে ব্যতিক্রমগুলি সীমাবদ্ধ করার পছন্দ দিচ্ছে , কারণ এটি ধরে নিয়েছে যে ক্লায়েন্ট কী ধরা পড়ে তা সীমাবদ্ধ করবে । আইএমএইচও আপনার অবশ্যই এই "বৈশিষ্ট্য" ব্যবহার করা উচিত নয় , কারণ আপনার ক্লায়েন্টদের রাস্তায় নমনীয়তার প্রয়োজন হতে পারে।

জাভা একটি পুরানো ভাষা যা খারাপভাবে ডিজাইন করা হয়েছে। আধুনিক ভাষায় এ জাতীয় বিধিনিষেধ নেই। এই ত্রুটির চারপাশের সহজতম উপায় হ'ল আপনার বেস ক্লাসটি 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

উপরোক্ত সমস্ত উপসংহার সত্যই রয়েছে, এমনকি যদি পরীক্ষিত এবং চেক না হওয়া ব্যতিক্রম উভয়ের সংমিশ্রণটি প্যারেন্ট-ক্লাস 'পদ্ধতিতে ঘোষণা করা হয়

সূত্র

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.