«Could not find or load main class»: الخوف المألوف لكل مبتدئ في Java
\n\nلقد بدأت للتو في تعلم Java، وكتبت أول برنامج HelloWorld.java، وبقلب يخفق ضغطت على Enter في الطرفية... وبدلاً من التحية المنتظرة رأيت رسالة باردة:
Error: Could not find or load main class HelloWorld\nCaused by: java.lang.ClassNotFoundException: HelloWorld\n\nمألوف؟ إذا كان الأمر كذلك، فأنت لست وحدك. هذا السؤال على Stack Overflow حصد ملايين المشاهدات وهو الرقم القياسي المطلق بين أخطاء مبتدئي Java. الخبر السار: السبب دائمًا تقريبًا تافه، والحل يستغرق 30 ثانية. الخبر السيء: إذا لم تفهم لماذا حدث هذا، فسوف يطاردك الخطأ مرارًا وتكرارًا.
\n\nفي هذه المقالة، سنشرح جميع الأسباب المحتملة لظهور «Could not find or load main class» بأمثلة محددة. ستتعلم ليس فقط كيفية إصلاح الخطأ، بل فهم كيف تبحث Java عن الفئة الخاصة بك. هيا بنا!
\n\nباختصار عن الشيء الرئيسي: ما الذي تحاول JVM قوله؟
\n\nعندما تكتب java ClassName، تتلقى الآلة الافتراضية Java (JVM) أمرًا: «ابحث عن الفئة بهذا الاسم وقم بتشغيل طريقة main الخاصة بها». إذا لم تتمكن JVM من العثور على ملف .class بالاسم المطلوب أو لم تجد فيه طريقة main صحيحة، فإنها تصاب بالذعر وتصدر هذا الخطأ.
من المهم أن تفهم: Java تعمل مع البايت كود (ملفات .class)، وليس مع المصادر (.java). أولاً، تقوم بترجمة .java إلى .class باستخدام الأمر javac، ثم تقوم بتشغيل .class باستخدام الأمر java. إذا حدث خطأ ما في الخطوة الثانية، فستحصل على الخطأ المنشود.
السيناريو 1: نسيت ترجمة الملف
\n\nالسبب الأكثر شيوعًا، خاصةً لأولئك الذين فتحوا الطرفية للتو. تكتب:
\n\njava HelloWorld\n\nولكنك لم تقم بتنفيذ ما يلي قبل ذلك:
\n\njavac HelloWorld.java\n\nبدون الترجمة، ملف HelloWorld.class ببساطة غير موجود. تحاول JVM بأمانة العثور عليه، لكنها لا تجده وتصدر الخطأ.
كيف تتحقق؟
\n- \n
- انظر في المجلد الحالي: هل يوجد ملف
HelloWorld.class؟ \n - إذا كان هناك فقط
HelloWorld.java— قم بالترجمة. \n - إذا لم يكن هناك أي منهما — تحقق مما إذا كنت في الدليل الصحيح. \n
السيناريو 2: خطأ إملائي في اسم الفئة (حالة الأحرف مهمة!)
\n\nJava هي لغة ذات كتابة صارمة و حساسية لحالة الأحرف. إذا كانت فئتك تسمى HelloWorld، ولكنك تكتب:
java helloworld\njava HelloWorld.class\njava HelloWorld.java\n\n— لن تفهمك JVM. يجب أن يتطابق اسم الفئة مع اسم الملف حرفًا بحرف. نعم، HelloWorld و helloworld هما اسمان مختلفان بالنسبة لـ JVM.
.class أو .java في الأمر java. فقط اسم الفئة المجرد!\nالسيناريو 3: مشاكل مع الحزمة (package) (أخطر فخ)
\n\nبمجرد أن تبدأ في استخدام الحزم (package)، تتغير قواعد اللعبة. لنفترض أن لديك ملفًا:
\n\n// الملف: src/com/pythonlib/MyApp.java\npackage com.pythonlib;\n\npublic class MyApp {\n public static void main(String[] args) {\n System.out.println("مرحبًا من PythonLib!");\n }\n}\n\nكثير من المبتدئين يفعلون هذا:
\n\ncd src\njavac com/pythonlib/MyApp.java // الترجمة تنجح\njava MyApp // خطأ!\n\nلماذا؟ لأن الاسم الكامل للفئة الآن هو com.pythonlib.MyApp، وليس فقط MyApp. تبحث JVM عن الفئة بالاسم الكامل