المتغيرات التي تحتوي على مسارات الملفات تعتبر من المتغيرات التي تحتاج إلى عناية خاصة أثناء عملك على مشاريعك.
في العادة إذا كان برنامجك يحتوي على أمر قراءة ملف فإن هذا الأمر يكون مهماً وبعد ذلك تُبنى العديد من الأوامر على فرضيّة أن البرنامج استطاع قراءة الملف.
وعندما يفشل برنامجك في قراءة الملف يصيح المترجم Compiler منادياً: لم يتم إيجاد الملف يا صديقي.. وهو الخطأ المشهور FileNotFoundException.
ما هو الخطأ FileNotFoundException
أعتبر FileNotFoundException من أهم الأخطاء التي توفر لك زمناً كبيراً أثناء تطوير العمل، فهو يكشف لك خطأ التعامل مع الملف في أول مرحلة.
FileNotFoundException هو صنف عادي مثلُه مثل غيره من أصناف الجافا، ويرث الصنف IOException، ما يعني أن الصنف الأب (Super Class) هو IOException والصنف الفرعي (Sub Class) هو FileNotFoundException.
تحتاجُ الآن لمعرفة كيف يحدث هذا الخطأ.. شاهدهُ فيما يلي..
بدايةُ الخطأ FileNotFoundException في الشفرة المصدرية
لديك هنا مثالٌ بسيطٌ جداً لقراءة ملف عبر الصنف FileInputStream وطباعة أول حرف من الملف.
package mycalculator; import java.io.*; public class FileNotFoundBug { public static void main (String args[]){ try{ FileInputStream testFile = new FileInputStream("D://fileToRead.txt"); System.out.println((char)testFile.read()); testFile.close(); }catch(IOException e){ System.out.println("File not found"); e.printStackTrace(); }//end catch }//end main method }//end class
سأشرحُ لك الأجزاء المهمة من الشفرة المصدرية:
- السطر 3: هنا يستورد البرنامج حزمة الإدخال والإخراج كاملة Java.io والتي نستخدم منها Java.io.FileInputStream و Java.io.IOException.
- السطر 9: يحاول البرنامج قراءة الملف من المسار الموصوف في دالة البناء (Constructor) وهو [D:/fileToRea.txt].
- السطر 14: يطبع البرنامج مكدس الأخطاء (Stack Trace) على الشاشة. هذه الخطوة حتى تستطيع معرفة الخطأ الذي حدث.
أفترضُ هنا أنك تعلم مهمام بقية الأسطر في هذه الشفرة المصدرية البسيطة، وبما أننا نتناول في هذه التدوينة الجزء الخاص بـ FileNotFoundException سأكتفي بهذا القدر.
من أجل أن تعمل هذه الشفرة المصدرية تأكد من وجود ملف مسمى ب fileToRead.txt في المجلد D كما في الصورة التالية:

والآن هيّا لتصنع الخطأ بنفسك، عندما تستطيع صنع الخطأ تعرف لماذا يحدث و كيف تستطيع اصلاحه كذلك.
أما إذا كنت على عُجالةٍ تبحث عن طريقة الحل فقط فهي كذلك في الجزء التالي.
قد يكون سبب ظهور FileNotFoundException عدم وجود الملف
السببُ الأول والأشهر لحدوث الخطأ هو عدم صحة المسار أو عدم وجود الملف.
من الأخطاء في المسار والتي تؤدي إلى ظهور الخطأ FileNotFoundException :
- خطأ كتابي في اسم المسار.
- نسيان الإمتداد file extension في اسم الملف.
- ينتهي المسار في مجلد بدلاً عن ملف.
وقد تكون هناك أيُّ أسبابٍ أخرى..
إذا أردت أن ترى هذا الخطأ، غيّر اسم الملف في شفرتك المصدرية إلى أي اسم خاطئ ثم نفذ البرنامج. ستجد أن البرنامج قد طبع لك مكدس الأخطاء كالتالي

لاحظ أن نهاية الخطأ في المربع الأزرق تقول، لم يتم إيجاد الملف المطلوب، يجب أن تنتبه لنهاية الخطأ لأنها تمثل الفرق عند المقارنة مع الخطأ الآتي.
ما عليك هنا إلا مراجعة المسار مرة أخرى والتأكد من وجود الملف كما وصفته في دالة بناء الصنف FileInputStream.
حل هذه المشكلة
قد تحتاج إلى مراجعة الأحرف “صغير وكبير” والتأكد من وجود الإمتداد وغيرها من الإجراءات البسيطة. أو ببساطة بإمكانك نسخ المسار الموجود بالخطأ كما تراه في الصورة السابقة.
قد يكون سبب ظهور FileNotFoundException عدم وجود صلاحية
وفق تجربتي، هذا الخطأ أقل حدوثاً في بيئة ويندوز، ولكنه أكثر ظهوراً في بيئة لينكس وفي استضافات المواقع بصورة عامة.
في هذه الحالة يكونُ مسارُك صحيحاً تماماً. مسار ذهبي..
ولكن البرنامج يظل لا يستطيع قراءة الملف! شاهد الخطأ أدناه

لصنع هذا الخطأ في نظام التشغيل ويندوز:
- تأكّد أولاً من أن المسار صحيح تماماً وأنك لا تواجه السبب الأول.
- إذهب إلى الملف الذي يحاول البرنامج قراءته وادخل إلى خصائص الملف واتبع الخطوتين بالصورة أدناه

تنبيه: احتفظ بمسميات المستخدمين المحذوفين لأنك ستحتاج أن تضيفهم مرة أخرى.

هكذا تكون قد حذفت صلاحية الوصول إلى الملف.
الآن عُد إلى شفرتك المصدرية ونفّذها. ستجد أن البرنامج الخطأ تحول إلى خطأ عدم وجود صلاحية رغم أنه ما زال FileNotFoundException.
الآن عُد إلى خصائص الملف السابق وأعد إضافة المستخدمين الذين حذفتهم سابقاً ستجد أن البرنامج عاد إلى العمل مرة أخرى.
حل المشكلة
عندما يكون خطأ FileNotFoundException متعلقاً بعدم وجود صلاحية فإنه يحتاج إلى خبرة في نظام التشغيل لمراجعة صلاحية وصول برنامجك إلى الملف المطلوب.
حلول لمشاكل اخري قد تفيدك:
ما هو الخطأ “java.lang.nullpointerexception” و كيف يتم إصلاحه!!
انا عندي الخطأ الأول و هو أن السيستم لا يستطيع رؤيه الملف مع العلم انا اخذت المسار copy paste… و كان الملف يعمل سابقا و الآن لا يعمل.. و لكن المشاريع شغاله عادي على netbeans ارجو المساعده
من الممن أن تلصق شفرتك المصدرية هنا ليراجعها الزوار ويخبروك بالخطأ
ماسبب هذا الخطأ Exception in thread main java.lang.UnsuportedOperationException not supported yet
لو سمحت ممكن حل للمشلكه دى فى اﻷندرويد
جزاك اللع عنا كل خير
جُزيت الجنّة.
كيف اسوي قناة على اليوتيوب
والله بحثتلها كثير بس ماليقتهة
السلام عليكم أخ مصطفي
اخي لو تكرمت تعطينا كتاب نافع للمبتدئين
بارك الله فيك
و عليكم السلام أخي تركي،
الكتب والمراجع تفضيلات شخصية يختلف تقبلها بين شخص وآخر. شخصياً أرى سلسلة for dummies جيدة للبدايات.
استاذ مصطفى حبَّذا لو تكتب مقال عن الملفات الداخلية في جافا اللتي لا يمكن الاستغناء عنها والملفات الخارجية… https://t.co/cEu4nguxbF