জাভা ত্রুটি: অন্তর্ভুক্ত সুপার কনস্ট্রাক্টর ডিফল্ট কনস্ট্রাক্টরের জন্য অপরিজ্ঞাত


89

আমার কাছে কিছু সাধারণ জাভা কোড রয়েছে যা এর কাঠামোর সাথে এটির অনুরূপ:

abstract public class BaseClass {
    String someString;
    public BaseClass(String someString) {
        this.someString = someString;
    }
    abstract public String getName();
}

public class ACSubClass extends BaseClass {
    public ASubClass(String someString) {
        super(someString);
    }
    public String getName() {
        return "name value for ASubClass";
    }
}

আমার বেশ কয়েকটি কয়েকটি সাবক্লাস থাকবে BaseClass, প্রত্যেকটি getName()নিজস্ব পদ্ধতিতে পদ্ধতিটি প্রয়োগ করে ( টেমপ্লেট পদ্ধতির প্যাটার্ন )।

এটি ভালভাবে কাজ করে তবে আমি সাবক্লাসগুলিতে রিডানড্যান্ট কনস্ট্রাক্টর থাকা পছন্দ করি না। এটি আরও টাইপ করা এবং এটি বজায় রাখা কঠিন। আমি যদি BaseClassকনস্ট্রাক্টরের পদ্ধতি স্বাক্ষরটি পরিবর্তন করতে পারি তবে আমাকে সমস্ত উপশ্রেণী পরিবর্তন করতে হবে।

আমি যখন সাবক্লাস থেকে কনস্ট্রাক্টরটি সরিয়ে ফেলি, তখন আমি এই সংকলন-সময় ত্রুটিটি পাই:

Implicit super constructor BaseClass() is undefined for default constructor. Must define an explicit constructor

আমি কি সম্ভব করার চেষ্টা করছি?


4
দয়া করে, 'রিলান্ড্যান্ট' কনস্ট্রাক্টরটি ছেড়ে দিন! এটি আপনার কোডের পঠনযোগ্যতা বজায় রাখে এবং সমস্ত আধুনিক আইডিই এটি স্বয়ংক্রিয়ভাবে তৈরি করতে পারে, সুতরাং আপনাকে কেবল একটি শর্টকাট কী করতে হবে।
আন্দ্রেয়াস ডলক

4
এক বছর পরে আমার নিজের প্রশ্নটি পুনরায় পড়া এবং এটি আমার কাছে ঘটে যে আমি ম্যাট বি এর মত কনস্ট্রাক্টরগুলি (বেস ক্লাসে অন্তর্ভুক্ত) সরিয়ে ফেলতে পারতাম এবং তারপরে উদাহরণগুলি তৈরি করতে স্থির কারখানার পদ্ধতিটি ব্যবহার করতে পারি।
জোয়েল

উত্তর:


146

আপনি এই ত্রুটিটি পেয়েছেন কারণ যে শ্রেণীর কোনও নির্মাণকারী নেই তার একটি ডিফল্ট কনস্ট্রাক্টর রয়েছে, যা তর্ক-কম এবং নিম্নলিখিত কোডের সমতুল্য:

public ACSubClass() {
    super();
}

তবে যেহেতু আপনার বেসক্লাস একটি কনস্ট্রাক্টর ঘোষণা করেছে (এবং তাই ডিফল্ট নেই, নো-আর্গ কনস্ট্রাক্টর যা সংকলক অন্যথায় সরবরাহ করবে) এটি অবৈধ - বেসক্লাসকে প্রসারিত এমন একটি শ্রেণি কল করতে পারে না super();কারণ সেখানে কোনও যুক্তিযুক্ত কনস্ট্রাক্টর নেই। বেসক্লাসে

এটি সম্ভবত একটি সামান্য পাল্টা স্বজ্ঞাত কারণ আপনি মনে করতে পারেন যে একটি সাবক্লাসের স্বয়ংক্রিয়ভাবে কোনও বুনিয়াদী রয়েছে যা বেস ক্লাসে রয়েছে।

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


17
"এটি সম্ভবত সামান্য পাল্টা স্বজ্ঞাত কারণ আপনি মনে করতে পারেন যে একটি সাবক্লাসের স্বয়ংক্রিয়ভাবে কোনও নির্মাণকারী রয়েছে যা বেস ক্লাসে রয়েছে" " +1
মিস্টার_আর_আমস_ডি

4
উত্তরোত্তর স্বার্থে, আমি ভবিষ্যতের পাঠকদের জন্য আমার সমাধানটি প্রস্তাব করব: একটি নো-আরগ কনস্ট্রাক্টর তৈরি করুন BaseClassতবে এটিকে কেবল একটি UnsupportedOperationExceptionবা কিছু নিক্ষেপ করুন । এটি সর্বোত্তম সমাধান নয় (এটি মিথ্যাভাবে পরামর্শ দেয় যে শ্রেণি কোনও নো-আরগ নির্মাতাকে সমর্থন করতে পারে), তবে এটি আমি সবচেয়ে ভাল চিন্তা করতে পারি।
জেএমটাইলার

51

যারা এই ত্রুটির জন্য গুগল এবং এখানে পৌঁছেছেন তাদের জন্য: এটি পাওয়ার অন্য কোনও কারণ থাকতে পারে। যখন আপনার প্রজেক্ট সেটআপ হয় - সিস্টেম কনফিগারেশন মেলেনি গ্রহটি এই ত্রুটিটি দেয়।

উদাহরণস্বরূপ, আপনি যদি জাভা ১.7 প্রজেক্টটি Eclipse এ আমদানি করেন এবং আপনার কাছে 1.7 সঠিকভাবে সেট আপ করা হয়নি তবে আপনি এই ত্রুটিটি পেয়ে যাবেন। তারপরে আপনি হয় যেতে পারেন Project - Preference - Java - Compilerএবং switch to 1.6 or earlier; অথবা Window - Preferences - Java - Installed JREsআপনার জেআরই 1.7 ইনস্টলেশনটি যুক্ত করুন এবং ঠিক করুন।


4
স্রেফ গ্রহণের কোনও আপাত কারণে এই ত্রুটিটি পেয়েছে। তারপরে আমি ওয়ার্কস্পেসটি পরিষ্কার করেছি (মেনু প্রকল্প -> ক্লিন ...) এবং এটি চলে গেল।
এরিক্রিফ

7

এটি সম্ভব তবে আপনার এটির মতো নয়।

আপনাকে বেস শ্রেণিতে একটি নো-আরগস কনস্ট্রাক্টর যুক্ত করতে হবে এবং এটিই!

public abstract class A {
    private String name;
    public A(){
        this.name = getName();
    }
    public abstract String getName();


    public String toString(){
        return "simple class name: " + this.getClass().getSimpleName() + " name:\"" + this.name + "\"";
    }
}
class B extends A {
    public String getName(){
        return "my name is B";
    }
    public static void main( String [] args ) {
        System.out.println( new C() );
    }
}
class C extends A {
    public String getName() {
        return "Zee";
    }
}

আপনি যখন কোনও ক্লাসে কোনও কনস্ট্রাক্টর (কোনও) যুক্ত করবেন না তখন সংকলক আপনার জন্য ডিফল্ট কোনও আরগ কনস্ট্রাক্টর যুক্ত করবেন না।

যখন ডিফল্ট কোনও আরগ সুপার () এ কল করে না; এবং যেহেতু আপনার কাছে এটি সুপার ক্লাসে নেই আপনি সেই ত্রুটি বার্তাটি পান।

এটাই তো প্রশ্ন নিজেই।

এখন, উত্তর প্রসারিত:

আপনি কি সচেতন যে পৃথক পৃথক মান (ডেটা) নির্দিষ্ট করার জন্য একটি সাবক্লাস (আচরণ) তৈরি করা কোনও অর্থবোধ করে না ?? !!! আমি আশা করি আপনি করবেন।

যদি কেবলমাত্র সেই নামটিই "নাম" হয় তবে একটি একক শ্রেণির প্যারামেট্রাইজ করা যথেষ্ট!

সুতরাং আপনার এটির দরকার নেই:

MyClass a = new A("A");
MyClass b = new B("B");
MyClass c = new C("C");
MyClass d = new D("D");

বা

MyClass a = new A(); // internally setting "A" "B", "C" etc.
MyClass b = new B();
MyClass c = new C();
MyClass d = new D();

আপনি যখন এটি লিখতে পারেন:

MyClass a = new MyClass("A");
MyClass b = new MyClass("B");
MyClass c = new MyClass("C");
MyClass d = new MyClass("D");

যদি আমি বেসক্লাস কনস্ট্রাক্টরের পদ্ধতি স্বাক্ষরটি পরিবর্তন করতে চাই তবে আমাকে সমস্ত উপশ্রেণী পরিবর্তন করতে হবে।

ওয়েলস হ'ল উত্তরাধিকার হ'ল হ'ল সংযুক্তি তৈরির নিদর্শন যা ওও সিস্টেমে অনাকাঙ্ক্ষিত। এটি এড়ানো উচিত এবং সম্ভবত সংমিশ্রণে প্রতিস্থাপন করা উচিত।

আপনার যদি সত্যিই সাবক্লাস হিসাবে তাদের প্রয়োজন হয় তা ভাবুন। এজন্য আপনি দেখেন খুব ঘন ঘন ইন্টারফেস অন্তর্নিহিত ব্যবহৃত:

 public interface NameAware {
     public String getName();
 }



 class A implements NameAware ...
 class B implements NameAware ...
 class C ... etc. 

এখানে বি এবং সি এ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে যা তাদের মধ্যে খুব উচ্চতম সংযোগ তৈরি করতে পারে, ইন্টারফেস ব্যবহার করে দম্পতি হ্রাস করা হয়, যদি এ সিদ্ধান্ত নেয় তবে এটি আর "নাম আওয়ার" থাকবে না অন্য শ্রেণিগুলি ভেঙে পড়বে না।

অবশ্যই, আপনি যদি আচরণটি পুনরায় ব্যবহার করতে চান তবে এটি কাজ করবে না।


4
হ্যাঁ, আপনি বাদ দিয়ে আর নিশ্চিত করতে পারবেন না যে আপনার দৃষ্টান্তগুলি সঠিকভাবে শুরু হয়েছে (উদাহরণস্বরূপ এই বিশেষ ক্ষেত্রে নাম রয়েছে)
ChssPly76

@ সিএসপিপ্লাই 7676: হ্যাঁ, তবে সম্ভবত কারণ উত্তরাধিকারটি খারাপভাবে ব্যবহার করা হচ্ছে। আমি আমার উত্তরটি coverাকতে প্রসারিত করেছি।
অস্কারলাইজ

4

জেআরই সেট না করা অবস্থায় আপনি এই ত্রুটিটিও পেতে পারেন। যদি তা হয় তবে আপনার প্রকল্পে জেআরই সিস্টেম লাইব্রেরি যুক্ত করার চেষ্টা করুন ।

Eclipse IDE এর অধীনে:

  1. মেনু প্রকল্প খুলুন -> বৈশিষ্ট্যগুলি , বা প্যাকেজ এক্সপ্লোরারটিতে আপনার প্রকল্পে ডান ক্লিক করুন এবং বৈশিষ্ট্যগুলি (উইন্ডোজে Alt + Enter, ম্যাকের উপর কমান্ড + I) চয়ন করুন
  2. জাভা বিল্ড পাথ ক্লিক করুন তারপর লাইব্রেরি ট্যাবে
  3. মডিউলপথ বা ক্লাসপাথ নির্বাচন করুন এবং লাইব্রেরি যুক্ত করুন ... বোতাম টিপুন
  4. জেআরই সিস্টেম লাইব্রেরি নির্বাচন করুন তারপরে Next ক্লিক করুন
  5. রাখা কর্মস্থান ডিফল্ট JRE নির্বাচন করা (আপনার কাছে অন্য কোনো বিকল্প সময় নিতে পারে) এবং ক্লিক করুন শেষ
  6. শেষ পর্যন্ত প্রয়োগ এবং বন্ধ টিপুন ।

2

আর একটি উপায় হ'ল কল সুপার () ডেকে আনা ক্লাস কনস্ট্রাক্টরের প্রথম বিবৃতি হিসাবে প্রয়োজনীয় যুক্তি সহ with

public class Sup {
    public Sup(String s) { ...}
}

public class Sub extends Sup {
    public Sub() { super("hello"); .. }
}

0

সাবক্লাস কনস্ট্রাক্টরের প্রথম বিবৃতি হিসাবে সুপার ক্লাস কনস্ট্রাক্টরের কাছে আপনার কাছে কল না থাকলে এই ত্রুটিটি গ্রহণ করবে E


0

নেক্রোপোস্টিংয়ের জন্য দুঃখিত তবে ঠিক আজই এই সমস্যার মুখোমুখি। প্রত্যেকের জন্যও এই সমস্যার মুখোমুখি হওয়া - তার একটি সম্ভাব্য কারণ - আপনি superপদ্ধতির প্রথম লাইনে কল করবেন না । দ্বিতীয়, তৃতীয় এবং অন্যান্য লাইনগুলি এই ত্রুটিটিকে আগুন ধরিয়ে দেয়। সুপারের কলটি আপনার পদ্ধতিতে খুব প্রথম কল হওয়া উচিত। এক্ষেত্রে সবকিছু ঠিক আছে।


0

আমি উপরোক্ত সমস্যার সমাধান করেছি:

  1. প্রজেক্ট এ ক্লিক করুন।
  2. বৈশিষ্ট্য> জাভা বিল্ড পাথ> গ্রন্থাগার> জেআরই সিস্টেম লাইব্রেরি> সম্পাদনাতে ক্লিক করুন
  3. ডিফল্ট সিস্টেম জেআরই এবং সমাপ্ত নির্বাচন করুন
  4. প্রয়োগ এবং বন্ধ করুন।

-1

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

চিয়ার্স

 abstract public class BaseClass {
        // ADD AN ARGUMENTLESS CONSTRUCTOR TO THE BASE CLASS
        public BaseClass(){
        }

        String someString;
        public BaseClass(String someString) {
            this.someString = someString;
        }
        abstract public String getName();
    }

public class ACSubClass extends BaseClass {
    public ASubClass(String someString) {
        super(someString);
    }
    public String getName() {
        return "name value for ASubClass";
    }
}

এটি অবৈধ অবজেক্টগুলি (ছাড়াই someString) সেটগুলি তৈরি করা সহজ করে এবং তাই নির্মাতা হিসাবে সম্পূর্ণরূপে পরাস্ত করে।
রবার্ট

-1

আমার এই ত্রুটি ছিল এবং পদ্ধতির পাশে থেকে একটি চেষ্টা / ক্যাচ ব্লকে ফেলে দেওয়া একটি ব্যতিক্রম সরিয়ে এটি ঠিক করেছিলাম

উদাহরণস্বরূপ: FROM:

public static HashMap<String, String> getMap() throws SQLException
{

}

প্রতি:

public static Hashmap<String,String> getMap()
{
  try{

  }catch(SQLException)
  { 
  }
}

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