'Could not find or load main class' ত্রুটি কমান্ড প্রম্পটে একটি java কমান্ড ব্যবহার করে একটি Java প্রোগ্রাম লঞ্চ করার সময় ঘটে ক্লাসের নাম টার্মিনালে স্পেসিফাই করে। এর ঘটার কারণ প্রায়শই ব্যবহারকারীর প্রোগ্রামিং ভুল ক্লাস ডিক্লেয়ার করার সময়।
উল্লেখ করা হয়েছে, এই ত্রুটি প্রায়শই সিস্টেমের সাথে সম্পর্কিত নয় এবং ব্যবহারকারী নিচে দেখানো কয়েকটি পরিস্থিতিতে ভুল করেন। আগে বর্ধিত, আমরা ধরে নিচ্ছি যে আপনার জাভা প্রোগ্রামিং ভাষা এবং এটি কীভাবে কাজ করে তার একটি বেসিক জ্ঞান আছে।
জাভায় 'Could not find or load main class' ত্রুটির কারণ কী?
'Could not find or load main class' মেসেজের মানে হলো জাভা ইঞ্জিন ক্লাস ফেচ করার প্রথম ধাপ এক্সিকিউশনের জন্য ব্যর্থ হয়েছে। java command সঠিক ডিরেক্টরিতে ক্লাসটি লোকেট করতে পারলো না।
কিছু কেসে, আপনাকে সঠিক ফাইল পাথ যোগ করতে হবে এবং জাভা টার্মিনালকে সঠিক লোকেশনে পয়েন্ট করতে হবে। যেহেতু আপনি কমান্ড লাইন টার্মিনাল থেকে কমান্ড এক্সিকিউট করছেন, কম্পিউটারটি জানে না ক্লাসটি কোথায় পাওয়া যাবে বা কোথায় লোকেটেড। টার্গেটেড IDE-এ, এটি সমস্যা নয় কারণ IDE কারেন্ট ওয়ার্কিং ডিরেক্টরির দিকে একটি পয়েন্টার রাখে।
'java <class-name>' সিনট্যাক্স কী?
ট্রাবলশুটিং শুরু করার আগে যে টার্মিনাল আমাদের এরর রিটার্ন করছে কেন যখন এক্সিকিউট করার চেষ্টা করছি, প্রথমে আমাদের কমান্ডের সিনট্যাক্সে তাকাতে হবে। আপনি যদি সঠিক সিনট্যাক্স ব্যবহার না করেন, তবে আপনি অবশ্যই এই ত্রুটির সম্মুখীন হবেন।
কমান্ডের নরমাল সিনট্যাক্স এমন কিছু এইরকম:
java [ <option> ... ] <class-name> [<argument> ...]
এখানে <option> হলো একটি কমান্ড লাইন অপশন, <class-name> হলো একটি ফুলি কোয়ালিফাইড জাভা ক্লাস নাম, এবং <argument> হলো একটি কমান্ড লাইন আর্গুমেন্ট যা আপনার অ্যাপ্লিকেশনে পাস করা হয় যখন পুরো প্যাকেজ কম্পাইল হয়।
একটি বৈধ কমান্ডের উদাহরণ:
java -Xmx100m com.acme.example.ListAppuals kevin arrows bart
উপরের কমান্ডটি java কমান্ডকে নিচের অপারেশনগুলো এক্সিকিউট করতে বলবে:
- এটি 'com.acme.example.ListAppuals' ক্লাসের একটি কম্পাইলড ভার্সন খুঁজবে।
- খুঁজে পাওয়ার পর, এটি ক্লাসটি লোড করবে।
- পরবর্তী, যখন ক্লাস লোড হয়ে যাবে, ক্লাসটি একটি 'main' মেথড খুঁজবে একটি বৈধ সিগনেচার, মডিফায়ার, এবং রিটার্ন টাইপের সাথে। একটি স্যাম্পল মেইন ক্লাস কিছু এইরকম হবে:
public static void main(String[])
- মেথডটি 'kevin', 'arrows', এবং 'bart' আর্গুমেন্টসহ কল হবে string[] হিসেবে।
'Could not find or load main class' কিভাবে ফিক্স করবেন
সমাধান ১: ক্লাস নাম আর্গুমেন্ট চেক করা
ব্যবহারকারীরা যে সবচেয়ে সাধারণ ভুল করেন সেটি হলো তারা একটি ভুল ক্লাস নাম আর্গুমেন্ট হিসেবে প্রদান করেন (বা একটি সঠিক ক্লাস namn ভুল ফর্মে)। যেহেতু আমরা কমান্ড লাইনে প্যারামিটার ডিক্লেয়ার করছি, এটি অত্যন্ত সম্ভব যে আপনি ক্লাস নাম আর্গুমেন্টটি ভুল ফর্মে পাস করবেন। এখানে আমরা সকল সম্ভাব্য পরিস্থিতি লিস্ট করব যেখানে আপনি ভুল করতে পারেন।
- একটি সিম্পল ক্লাস নাম লিখা। আপনি যদি ক্লাসটি একটি প্যাকেজে ডিক্লেয়ার করেন যেমন 'com.acme.example', তবে আপনাকে জাভা কমান্ডে প্যাকেজসহ ফুল ক্লাসনেম ব্যবহার করতে হবে।
java com.acme.example.ListAppuals
বদলে
java ListAppuals
- আপনাকে একটি classname ডিক্লেয়ার করতে হবে ফাইলনেম বা পাথনেম ডিক্লেয়ার করার বদলে। জাভা ক্লাসটি ফেচ করে না আপনি যদি এর জন্য একটি পাথনেম/ফাইলনেম ডিক্লেয়ার করেন। ভুল এন্ট্রিগুলো شامل:
java ListAppuals.class java com/acme/example/ListAppuals.class
- Casing বিবেচনা করা উচিত। জাভা কমান্ডস কেস-সেনসিটিভ এবং আপনি যদি একটা লেটারের ভুল করুন, তবে আপনি মেইন ক্লাস লোড করতে পারবেন না। ভুল ভুলের উদাহরণ:
java com.acme.example.listappuals
- আপনাকে নয় একটি সোর্স ফাইলনেম ডিক্লেয়ার করতে। 앞서 বলা হয়েছে, আপনাকে শুধু সঠিক ফুল ক্লাসনেম ফর্মেটে ক্লাসটি ডিক্লেয়ার করতে হবে। একটি ভুলের উদাহরণ:
java ListAppuals.java
- এই ত্রুটিটি তখনও ঘটবে যদি আপনি একটি টাইপিং মিসটেক করেন বা পুরোপুরি ক্লাস নাম লিখতে ভুলেন।
আপনি যদি ক্লাসনেম ডিক্লেয়ার করতে কোনো অসাবধান ভুল করেন, তবে নিশ্চিত করুন যে আপনি সেটি ফিক্স করেছেন এবং তারপর প্রোগ্রাম লঞ্চ করার চেষ্টা করুন।
সমাধান ২: ক্লাসপাথ চেক করা
আপনি যদি সঠিকভাবে ক্লাসনেম ডিক্লেয়ার করেছেন কিন্তু এখনও ত্রুটি দেখাচ্ছে, তবে সম্ভবত java কমান্ডটি স্পেসিফাইড ক্লাসনেমটি পাথেই খুঁজে পাচ্ছে না। ক্লাসপাথ হলো একটি পাথ যেখানে জাভা রানটাইম রিসোর্স এবং ক্লাস ফাইল খুঁজে। আপনি সহজে ক্লাসপাথ সেট করতে পারেন দুটি ভিন্ন কমান্ড ব্যবহার করে যেমন নিচে দেখানো:
C:> sdkTool -classpath classpath1;classpath2... C:> set CLASSPATH=classpath1;classpath2...
ক্লাসপাথ সম্পর্কে আরও জানতে, আপনাকে নিচের ডকুমেন্টগুলো চেক আউট করা উচিত।
Java command documentation
Setting classpath
সমাধান ৩: ডিরেক্টরি চেক করা
আপনি যখন একটি ডিরেক্টরি ক্লাসপাথ হিসেবে ডিক্লেয়ার করেন, এটি সবসময় নেমস্পেসের রুটের সাথে соответствии রেখে। উদাহরণস্বরূপ যদি "/usr/local/acme/classes" ক্লাসপাথে থাকে, তবে জাভা "com.acme.example.Appuals" ক্লাসটি খুঁজবে। এটি নিচের পাথনেম সহ একটি ক্লাস খুঁজবে:
/usr/local/acme/classes/com/acme/example/Appuals.class
তো সারসংক্ষেপে, আপনি যদি নিচের অ্যাড্রেসটি ক্লাসপাথে রাখেন, জাভা ক্লাসটি খুঁজে পাবে না:
/usr/local/acme/classes/com/acme/example
আপনাকে আপনার সাবডিরেক্টরিও চেক করা উচিত এবং দেখতে হবে এটি FQN-এর সাথে মেলে কিনা। আপনার ক্লাসের FQN যদি "com.acme.example.Appuals" হয়, তবে জাভা "com/acme/example" ডিরেক্টরিতে "Appuals.class" খুঁজবে।
আপনাকে একটি উদাহরণ দিতে, ধরুন নিচের সিনেরিওটি:
- আপনি যে ক্লাসটি চালাতে চান: com.acme.example.Appuals
- ফুল ফাইল পাথ হলো: /usr/local/acme/classes/com/acme/example/Appuals.class
- কারেন্ট ওয়ার্কিং ডিরেক্টরি হলো: /usr/local/acme/classes/com/acme/example/
তब নিচের সিনেরিওগুলো ঠিক থাকবে:
# wrong, FQN is needed java Appuals # wrong, there is no `com/acme/example` folder in the current working directory java com.acme.example.Appuals # wrong, similar to above scenario java -classpath . com.acme.example.Appuals # OK ; a relative classpath is set java -classpath ../../.. com.acme.example.Appuals # OK; an absolute classpath is set java -classpath /usr/local/acme/classes com.acme.example.Appuals
নোট: ক্লাসপাথটিতে আপনার অ্যাপ্লিকেশনের প্রয়োজনীয় সকল অন্যান্য ক্লাস (non-system) ও অন্তর্ভুক্ত থাকতে হবে।
সমাধান ৪: ক্লাস প্যাকেজ চেক করা
যদি উপরের সব সমাধান আপনার কেসে সঠিক হয়, তবে আপনাকে নিশ্চিত করতে হবে যে আপনার সোর্স কোড সঠিক ফোল্ডারে রয়েছে। এছাড়া, আপনি সঠিকভাবে package ডিক্লেয়ার করেছেন। আপনি যদি আপনার কোড একটি IDE-এ রান করেন, তবে এটি সম্ভবত আপনাকে ইস্যু সম্পর্কে জানাবে। যিন্তু, আমাদের কেসে, যেহেতু আমরা কমান্ড প্রম্পটে রান করছি, ভুলটি অননোটিশড থাকবে এবং আপনি আলোচ্য ক্লাস এরর পাবেন।