ما هو الخطأ “java.lang.nullpointerexception” و كيف يتم إصلاحه!!

عند تنفيذ الشفرة المصدرية تظهر لك الأخطاء التي لم تنتبه لها أثناء البرمجة، من هذه الأخطاء Null pointer Exception.

لا يكون الخطأ Null pointer واضحاً أثناء كتابة الشفرة المصدرية، فهو من الأخطاء التي تظهر أثناء التنفيذ Runtime Error.

ولكن على عكس ما يتوقع فكثيراً يكون من السهل إيجاده، و في أحايين أخرى يكون مخفياً و يجب عليك متابعة الشفرة البرمجية لمعرفة أين وقع الخطأ و في أي مرحلة.

الآن ستتعرف على ما يسبب الخطأ Null pointer و إذا ظهر لك الخطأ Null pointer أثناء التنفيذ ما الذي يجب أن تفعله حتى تتخلص منه.

حل مشكلة null pointer exception

لماذا يظهر هذا الخطأ ؟

كما تعلم فإنه لإعداد المتغير يجب إجراء خطوتين:

  1. الإعلان عن المتغير Variable Declaration.
  2. تهيئة المتغير Variable initialization.

الإعلان عن المتغير مثل أن تخبر أحدهم بأن هناك شخصاً ما قادم و هو من أصدقائك، في الحقيقة هو لم يحضر بعد ولكن نعلم أنه سيأتي و أنه من أصدقائك.

فالإعلان عن المتغير في حقيقة لا يعني أن المتغير تم تعريفه، هذه أمثلة للإعلان عن المتغيرات

    int age;
    String name;
    Human ahmed;
    BigDecimal monthlyIncome;

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

عندها و عندها فقط بالإمكان التعامل مع هذا المتغير بإسناد القيم إليه و استخدام الدوال المتعلقة به.

ما يُسبب الخطأ NullPointer هو التعامل مع المتغير الذي تم الإعلان عنه فقط كأنه تم تعريفه و تهيئته، ففي هذه الحالة فأنت تتعامل مع شخص غير موجود و تحاول التحدث معه 🙂


عدم تهيئة المتغير أو إسناد القيمة null إليه نتيجتهما سواء، لأن null تحرر المتغير من قيمته و يُصبح بلا قيمة.

أمثلة لأخطاء Null Pointer

        String flag;
        flag.getBytes();
        String exit = "yes";
        exit = null;
        exit.getBytes();
        String testArray[] = new String[5];
        testArray[0]="0";
        testArray[1]="1";
        testArray[2]="2";
        testArray[3]="3";
        
        for(int counter = 0; counter < testArray.length; counter++){
            testArray[counter].getBytes();
        }
        class Human{
            private String actualName;
            public Human(String name){
                actualName = name;
            }
            
            protected String getActualName(){
                return actualName;
            }//end getName
        }
        
        Human adam;        
        String firstHuman = adam.getActualName();

كيف تتغلب عليه إذا أصرّ على مواجهتك؟

ليس من الصعب حل مشكلة Null Pointer Exception غالباً، فالمترجم compiler إبتداءً يوفر لك معلومات مهمة لتستخدمها في محاولة حل الخطأ.

  • أهم هذه المعلومات هو رقم السطر الذي حدث به الخطأ، هذه هي البداية
null-pointer-exception
خطأ NullPointer
  • بعد تحديد الخطأ السطر الذي حدث به الخطأ، ابحث عن المتغيرات التي يتم التعامل معها في هذا السطر.
  • ابحث عن المتغير أو المتغيرات التي تم الإعلان عنها ولكن لم تتم تهيئتها أو لم تم إسناد القيمة null إليها قبل الوصول إلى سطر الخطأ.
  • أصلح الخطأ بإسناد القيمة المناسبة قبل الوصول إلى سطر الخطأ.

في الأمثلة السابقة سيكون الحل كما يلي

        String flag;
        flag= "AEE5F";//Initilaization
        flag.getBytes(); 
        String exit = "yes";
        //exit = null;
        exit.getBytes();
        String testArray[] = new String[5];
        testArray[0]="0";
        testArray[1]="1";
        testArray[2]="2";
        testArray[3]="3";
        testArray[4]="4";//Initialization
        
        for(int counter = 0; counter < testArray.length; counter++){
            testArray[counter].getBytes();
        }
class Human{
            private String actualName;
            public Human(String name){
                actualName = name;
            }
            
            protected String getActualName(){
                return actualName;
            }//end getName
        }
        
        Human adam;
        adam = new Human("adam");//Initialization
        String firstHuman = adam.getActualName();

هذه هي خطوات حل مشكلة Null Pointer Exception و التي يمر بها أغلب المبتدئين و التي تعتبر من أكثر الأخطاء البرمجية شيوعاً.. على كلٍّ لا أعتقد أنه سيقف في طريقك إبتداءً من اليوم.


قد يعجبك أيضا

ابسط شرح للتمرير بالمرجع و التمرير بالقيمة مع حيلة لتعمل الجافا بالتمرير بالمرجع

ابسط شرح للتمرير بالمرجع و التمرير بالقيمة مع حيلة لتعمل الجافا بالتمرير بالمرجع

شرح FIFO و LIFO في هياكل البيانات: أساس للتعرف على هياكل بيانات أخرى

شرح FIFO و LIFO في هياكل البيانات: أساس للتعرف على هياكل بيانات أخرى
ما رأيك؟ اترك تعليقاً أدناه


  1. انا داخل مخصوص اقولك جزاك الله خيرا وربنا يوفقك لان الايرور دا كان عندى والحمدلله صلحته بسببك

  2. احاول عمل برنامج به arraylist ويظهر رساله خطأ “java.lang.NullPointerException”
    عند السطر
    while (i< quakeData.size()){
    او عند تغييره الى
    for (int i=from+1; i< copy.size(); i++)
    وكأن المشكله في ان ال arraylist غير معلوم ال size لها فما الحل وهل دي المشكلة فعلا

  3. السلام عليكم انا نزلت لعبه ماين كرفت كراك حلى اللاب وإشغاله عادي بس لما احاول ادخل الأونلاين مع صديق لي يطلعلي
    java.lang.nullpointerexception
    أرجو ألمساعده لحل مشكله
    على وندز ١٠ وعلى اخر إصدار جافا
    جربت لنشرات كثيره ولكن كلهم يطلعولي نفس المشكلة

    1. مرحباً بك أحمد،

      يبدو أن هنالك خطئاً برمجياً. بإمكانك التواصل مع مُنتج اللعبة للوصول لحل علماً أننا لا نهتم بهذا الجانب في هذه المدونة.

  4. السلام عليكم اخي
    عملت اظافة في الواتساب بس لاكن عند الدخول ع اي محادثة يظهر لي هذا الخطاء
    فيك تحل لي هذا الشرح اذا مافي مانع

    STACK_TRACE=java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean com.gbwhatsapp.youbasha.ui.activity.SwipeBackController.processEvent(android.view.MotionEvent)’ on a null object reference
    at com.gbwhatsapp.Conversation.dispatchTouchEvent(Conversation.java)
    at android.support.v7.view.i.dispatchTouchEvent(WindowCallbackWrapper.java)
    at android.support.v7.view.i.dispatchTouchEvent(WindowCallbackWrapper.java)
    at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:467)
    at android.view.View.dispatchPointerEvent(View.java:10954)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5051)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4908)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4492)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4458)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4591)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4466)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4648)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4492)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4458)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4466)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4439)
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6936)
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6875)
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6836)
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7046)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:323)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:6688)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

{"email":"البريد الالكتروني غير صحيح","url":"رابط الموقع غير صحيح","required":"بعض الحقول المطلوبة لم تتم تعبئتها"}

نجاح!

تنبيه!

خطأ!