NullPointerException چیست , و چگونه می توان آن را برطرف کرد؟

  • شروع کننده موضوع sanmi
  • تاریخ شروع
S

sanmi

Guest
#1
سلام
بنده یه مشتکلی که دارم Null Pointer Exceptions (java.lang.NullPointerException) هست و اینکه چطور اتفاق می افته ؟

و اینکه چطور میشه به طور کامل برطرفش کرد؟
 

ROOT

Administrator
عضو کادر مدیریت
#2
وقتی متغیر مرجع را فراخوانی می کنید (به عنوان مثال یک شی) در حال ایجاد یک اشاره گر به یک شی هستید.

کد زیر را در نظر بگیرید که متغیری از نوع اولیه int را اعلام می کنید:

code:
int x;
x = 10;
در این مثال ، متغیر x یک int است و جاوا 0 مقدار اولیه می دهد. وقتی مقدار آن را در خط دوم به آن اختصاص می دهید ، مقدار 10 شما در محل حافظه ای که به آن x گفته می شود ، نوشته می شود. اما ، وقتی می خواهید یک ارجاع را اعلام کنید ، اتفاق متفاوتی رخ می دهد. کد زیر را بگیرید:

code:
Integer num;
num = new Integer(10);
خط اول یک متغیر به نام num را اعلام می کند ، اما هنوز در واقع حاوی یک مقدار اولیه ای نیست.

در عوض ، حاوی یک نشانگر است (زیرا نوع آن Integer است که یک نوع مرجع است). از آنجایی که شما هنوز نگفته اید که به چه چیزی باید اشاره کنید ، جاوا آنرا باطل می کند ، یعنی جاوا میگه "من به هیچ چیز اشاره نمی کنم".

در سطر دوم ، كلمه new Integer براي پيدا كردن (يا ايجاد) يك شيء از نوع Integer استفاده مي شود و متغير نشانگر num به آن شيء Integer اختصاص مي يابد.

NullPointerException زمانی اتفاق می افتد که شما یک متغیر را اعلام می کنید اما قبل از تلاش برای استفاده از محتویات متغیر (به نام ارجاع) یک شی ایجاد نکرده اید و به متغیر اختصاص می دهید. بنابراین شما به چیزی اشاره می کنید که در واقع وجود ندارد.

این هم معمولاً هنگام استفاده اتفاق می افتد. برای دسترسی به یک روش یا فیلد با استفاده از [ برای فهرست کردن آرایه از اون استفاده میشه

اگر قبل از ایجاد شیء سعی در تغییر شماره دارید ، NullPointerException دریافت می کنید. در مهمترین موارد ، کامپایلر مشکلی را به وجود می آورد و به شما اطلاع می دهد که "شماره ممکن است اولیه نشده باشد" ، اما گاهی اوقات ممکن است کدی بنویسید که مستقیماً شیء ایجاد نمی کند.

به عنوان مثال ، شما ممکن است روشی به شرح زیر داشته باشید:
code:
public void doSomething(SomeObject obj) {
   //do something to obj
}
در این حالت ، شما در حال ایجاد Object نیستید ، بلکه فرض می کنید که قبل از فراخوانی متد doSomething () ایجاد شده است. توجه داشته باشید ، می توانید روش را به این صورت فراخوانی کنید:

code:
doSomething(null);
در این حالت ، obj نال میگیره . اگر این روش برای انجام کاری با شیء منتقل شده مناسب باشه ، مناسبه که NullPointerException را پرتاب کنید زیرا این یک خطای برنامه نویس است و برنامه نویس برای اهداف اشکال زدایی به آن اطلاعات نیاز دارد. که باید در این صورت نام متغیر شیء را در پیام ، مانند حالت زیر وارد کنید

code:
Objects.requireNonNull(a, "a");
از طرف دیگه ، ممکنه مواردی باشه که هدف از روش صرفاً کار بر روی جسم منتقل شده نباشد و بنابراین ممکن است یک پارامتر تهی قابل قبول باشد. در این حالت ، لازم است که یک پارامتر تهی را بررسی کرده و به گونه ای متفاوت رفتار کنید. شما همچنین باید این را در مستندات توضیح دهید. به عنوان مثال ، doSomething () می تواند به صورت زیر نوشته شود:

code:
/**
  * @param obj An optional foo for ____. May be null, in which case
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj == null) {
       //do something
    } else {
       //do something else
    }
}
امیدوارم توضیحات کافی بوده باشه
 
بالا