حل مشكلة FileNotFoundException في جافا

عند التعامل مع الملفات

المتغيرات التي تحتوي على مسارات الملفات تعتبر من المتغيرات التي تحتاج إلى عناية خاصة أثناء عملك على مشاريعك.

في العادة إذا كان برنامجك يحتوي على أمر قراءة ملف فإن هذا الأمر يكون مهماً وبعد ذلك تُبنى العديد من الأوامر على فرضيّة أن البرنامج استطاع قراءة الملف.

وعندما يفشل برنامجك في قراءة الملف يصيح المترجم 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 في اسم الملف.
  • ينتهي المسار في مجلد بدلاً عن ملف.

وقد تكون هناك أيُّ أسبابٍ أخرى..

إذا أردت أن ترى هذا الخطأ، غيّر اسم الملف في شفرتك المصدرية إلى أي اسم خاطئ ثم نفذ البرنامج. ستجد أن البرنامج قد طبع لك مكدس الأخطاء كالتالي

FileNotFoundException - لم يتم إيجاد الملف
FileNotFoundException – لم يتم إيجاد الملف

لاحظ أن نهاية الخطأ في المربع الأزرق تقول، لم يتم إيجاد الملف المطلوب، يجب أن تنتبه لنهاية الخطأ لأنها تمثل الفرق عند المقارنة مع الخطأ الآتي.

ما عليك هنا إلا مراجعة المسار مرة أخرى والتأكد من وجود الملف كما وصفته في دالة بناء الصنف FileInputStream.

حل هذه المشكلة

قد تحتاج إلى مراجعة الأحرف “صغير وكبير” والتأكد من وجود الإمتداد وغيرها من الإجراءات البسيطة. أو ببساطة بإمكانك نسخ المسار الموجود بالخطأ كما تراه في الصورة السابقة.

قد يكون سبب ظهور FileNotFoundException عدم وجود صلاحية

وفق تجربتي، هذا الخطأ أقل حدوثاً في بيئة ويندوز، ولكنه أكثر ظهوراً في بيئة لينكس وفي استضافات المواقع بصورة عامة.

في هذه الحالة يكونُ مسارُك صحيحاً تماماً. مسار ذهبي..

ولكن البرنامج يظل لا يستطيع قراءة الملف! شاهد الخطأ أدناه

FileNotFoundException – لا توجد صلاحية

لصنع هذا الخطأ في نظام التشغيل ويندوز:

  • تأكّد أولاً من أن المسار صحيح تماماً وأنك لا تواجه السبب الأول.
  • إذهب إلى الملف الذي يحاول البرنامج قراءته وادخل إلى خصائص الملف واتبع الخطوتين بالصورة أدناه
    إظهار خطأ عدم وجود صلاحية - 1
    إظهار خطأ عدم وجود صلاحية – 1
  • حتى تتحاشى التفاصيل، بإمكانك حذف جميع المستخدمين تحت Group or user name، كما ترى أدناه لدي مستخدم واحد ولكن ربما يظهر لديك العديد من المستخدمين – تنبيه: احتفظ بمسميات المستخدمين المحذوفين لأنك ستحتاج أن تضيفهم مرة أخرى.
    إظهار خطأ عدم وجود صلاحية - 2
    إظهار خطأ عدم وجود صلاحية – 2

     

هكذا تكون قد حذفت صلاحية الوصول إلى الملف.

الآن عُد إلى شفرتك المصدرية ونفّذها. ستجد أن البرنامج الخطأ تحول إلى خطأ عدم وجود صلاحية رغم أنه ما زال FileNotFoundException.

الآن عُد إلى خصائص الملف السابق وأعد إضافة المستخدمين الذين حذفتهم سابقاً ستجد أن البرنامج عاد إلى العمل مرة أخرى.

حل المشكلة

عندما يكون خطأ FileNotFoundException متعلقاً بعدم وجود صلاحية فإنه يحتاج إلى خبرة في نظام التشغيل لمراجعة صلاحية وصول برنامجك إلى الملف المطلوب.

مصطفى الطيب

صديقٌ لنُظمِ المعلُومات و عُلومِ الحَاسِب و مُختصٌ بهما، مُحبٌ للعِلمِ و نَشرِه. أُشاركُ معارفي و تَجاربي و خِبراتي في تَدويناتٍ و دوراتٍ من خلال مُدونةِ عُلوم.

مقالات ذات صلة

‫4 تعليقات

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *