خانه » لایبرری های مفید و تجربیات شخصی خیلی مفید !!! » چند راه برای جلوگیری از NullPointerException

چند راه برای جلوگیری از NullPointerException

 دربرنامه نویسی اندروید (جاوا) یکی از متداول ترین ارور ها NullPointerException هست ، و اگر بتونیم بیشتر این ارور ها را قبل از وقوع  جلوگیری کنیم ، برنامه ای روان و بدون اکسپشن های اعصاب خورد کن خواهیم داشت.

NullPointerException  زمانی رخ میده که قصد داریم مثلا از یک لیستی که null هست ، عملیات get یا size  یا هر عملیات دیگری  را انجام دهیم. ویا یک رشته (String) را می خواهیم با یک رشته دیگر که مقدار آن null  هست مقایسه گنیم و یا در اندروید و مخصوصا در صفحاتی که از چند thread استفاده شده  یک thread وظیفه گرفتن اطلاعات از اینترنت را دارد و بعد از دریافت اطلاعات قصد بروز رسانی صفحه (UI) را دارد  اما قبل از اتمام کار صفحه بسته شده است و زمان استفاده از context ارور NullPointerException  می دهد .

در این جا چند روش  ساده برای جلوگیری از این  اکسپشن را که از لینک زیر برداشته ام قرار میدهم :

http://javarevisited.blogspot.nl/2013/05/ava-tips-and-best-practices-to-avoid-nullpointerexception-program-application.html

 

۱ : زمان استفاده از متد  equals() و  equalsIgnoreCase()   رشته ای را که مطمئن هستید null نیست  اول قرار دهید :


Object unknownObject = null;

//wrong way - may cause NullPointerException
if(unknownObject.equals("knownObject")){
   System.err.println("This may result in NullPointerException if 

unknownObject is null");
}

//right way - avoid NullPointerException even if unknownObject is null
if("knownObject".equals(unknownObject)){
    System.err.println("better coding avoided NullPointerException");
}

به مثال توجه کنید : در رشته ها فرقی نمی کند که به کدام حالت بنویسیم اما  نوشتن به صورت اول امکان بروز اکسپشن در صورت null بودن را دارد در صورتی که در  حالت دوم خود متد  euals() این اکسپشن را مدیریت می کند .

 

۲ . برای گرفتن مقدار رشته (String) به جای toString() از String.valueof() استفاده کنید :

BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //doesn’t throw NPE
System.out.println(bd.toString()); //throws "Exception in thread "main" java.lang.NullPointerException"

اگر بر روی یک شئ که null باشده toString() را فراخوانی کنید ، NullPointerException رخ می دهد ، در صورتی که اگر از String.valueOf() استفاده کنید در صورت null بودن مقدار "null" را برمیگرداند .

 

۳ . از متد و لایبرری های امن (safe) استفاده کنید :

لایبرری های زیادی هستند که زمان null بودن اکسپشن نمی دهند :

مثلا به جای استفاده از isEmpty() می توانید از StringUtils.isEmpty(null)استفاده کنید :

//StringUtils methods are null safe, they don't throw NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));

Output:
true
true
false
false

 

۴ . در متد ها مخصوصا متد هایی که قصد برگرداندن یک لیست را دارند null برنگردانید :

به جای برگرداندن null یک کالکشن خالی یا یک مقدار خالی را برگردانید (مثلا یک رشته خالی "" ) در این صورت از بروز این اکسپشن در جاهایی که از این متد استفاده کرده اید جلوگیری می کنید :

public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}

در مثال بالا با استفاده از Collections.EMPTY_LIST یک لیست خالی بر می گردانیم.

 

 

 

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

7 دیدگاه

  1. mrc az webe khobet,,,,very very good.tanks

  2. سلام

    ممنون از سایت خوب و نکات بسیار عالیتون

    و ممنون که به صورت راگان در اختیار بقیه قرار دادین

    فقط میتونم براتون دعا کنم و تشکر کنم

    ممنوننننننننن

  3. سلام. جالب بود. موفق و پیروز باشید

  4. با عرض سلام و تقدیم احترام

    بابت کارهای قشنگتونم ممنون

    شما مصادق بارز عمل به حدیث زکات العلم نشرها هستید

    مطمئناً انجام کار خوب و شایسته نیاز به روحیه خوب وپشتکار بالا دارد و شما الحمدلله از آن بهره مندید.

    بابت زحماتی که کشیدید فقط می توانیم تشکر لسانی از شما داشته باشیم، سپاس

  5. سلام

    valueOf

    برای گرفتن مقادیر عددی طراحی شده، و نه رشته. همچنین این متد درمقابل نال، رشته نال رو بر می گردونه، و نه نوع نال.

    بعلاوه این متد در پشت پرده متد toString رو صدا میزنه.

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا