JavaRush /وبلاگ جاوا /Random-FA /ترفندها و نکات. چگونه از NullPointerException در برنامه ه...
DarthVictor
مرحله

ترفندها و نکات. چگونه از NullPointerException در برنامه های جاوا جلوگیری کنیم

در گروه منتشر شد
ترفندها و نکات.  نحوه جلوگیری از NullPointerException در برنامه های جاوا - 1امروز تکنیک های ساده ای را به شما نشان خواهم داد که چگونه از NullPointerException در برنامه های خود اجتناب کنید. دنبال کردن آنها آسان است، اما به طور قابل توجهی قابلیت اطمینان و کیفیت کد شما را بهبود می بخشد. علاوه بر این، در تجربه من، اولین نکته تأثیر قابل توجهی بر کیفیت کد شما خواهد داشت. اگر ترفندهای برنامه نویسی جاوا دیگری را می شناسید، در نظرات به اشتراک بگذارید. ترفندها و نکات.  نحوه جلوگیری از NullPointerException در برنامه های جاوا - 2

فراخوانی متدهای equals() و equalsIgnoreCase() در یک رشته شناخته شده به جای یک شی ناشناخته

همیشه equals()روی یک رشته شناخته شده متدی را فراخوانی کنید که می دانید نیست null. روش equals()متقارن است، یعنی فراخوانی می شود a.equals(b)و b.equals(a)همان نتیجه را می دهد (اگر aو bنه null) و به همین دلیل بسیاری از برنامه نویسان توجه نمی کنند که کدام اشیا equals()، y aیا y نامیده می شوند b. یکی از عوارض جانبی این است که در صورت فراخوانی متد، NullPointerException است null.
Object unknownObject = null;

//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
   System.err.println("This may result in NullPointerException if unknownObject is null");
}

//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
    System.err.println("better coding avoided NullPointerException");
}
این ساده ترین نکته برای اجتناب از NullPointerException بود، اما به تنهایی پیشرفت بزرگی ایجاد می کند زیرا این روش equals()در همه جا یافت می شود.

در مواردی که هر دو نتیجه یکسانی دارند، valueOf() را از toString() انتخاب کنید

از آنجایی که فراخوانی toString()یک مرجع با یک مقدار nullیک NullPointerException ایجاد می کند، بهتر است از فراخوانی valueOf()زمانی استفاده کنیم که بتوانیم همان نتیجه را دریافت کنیم، زیرا فراخوانی valueOf()از nullآن برمی گردد null. این امر به ویژه در مورد کلاس های wrapper مانند Integer, Floatیا Double.BigDecimal
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
زمانی که مطمئن نیستید یک شی می تواند وجود داشته باشد nullیا خیر از این نکات استفاده کنید.

nullاز روش ها و کتابخانه های ایمن استفاده کنید

بسیاری از کتابخانه های منبع باز وجود دارند که بار سنگین آزمایش را بر عهده می گیرند null. یکی از رایج ترین آنها StringUtilsاز Apache Commons است. استفاده از روش هایی مانند StringUtils.isBlank(), isNumeric()و isWhiteSpace()... شما لازم نیست نگران پرتاب NullPointerException باشید.
//Методы StringUtils являются null-безопасными, они не вызовут 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));
خروجی: true true false falsenull و با این حال، قبل از استفاده، مطالعه مستندات روش ها و کلاس های ایمن را فراموش نکنید . این یکی دیگر از بهترین ترفندهای جاوا است که بدون نیاز به تلاش زیاد منجر به پیشرفت های عظیم می شود.

سعی کنید از یک متد برنگردید null، بهتر است یک مجموعه خالی را برگردانید

این یکی دیگر از نکات خوب برنامه نویسی جاوا است که جاشوا بلوخ در کتاب جاوا: برنامه نویسی موثر توضیح داده است. هنگام برگرداندن مجموعه‌ها یا آرایه‌های خالی، مطمئن شوید که فراخوانی متدهای پایه مانند NullPointerException است size()یا خیر. length()کلاس Collectionsبه طور خاص پیاده سازی راحت لیست ها، مجموعه ها و دیکشنری های خالی را اعلام می کند Collections.EMPTY_LIST: Collections.EMPTY_SETو Collections.EMPTY_MAP. مثلا:
public List getOrders(Customer customer){
   List result = Collections.EMPTY_LIST;
   return result;
}
به طور مشابه، می توانید به جای بازگشت Collections.EMPTY_SETاز آن استفاده کنید . Collections.EMPTY_MAPnull

از حاشیه نویسی @NotNull و @Nullable استفاده کنید

در توضیح روش‌های خود، می‌توانید nullقراردادهای ایمنی روش را با استفاده از حاشیه‌نویسی @NotNullو @Nullable تعریف کنید تا مشخص کنید آیا یک روش می‌تواند برگردد nullیا خیر. کامپایلرها و IDE های مدرن می توانند از این حاشیه نویسی ها برای تجزیه و تحلیل کد شما استفاده کنند و توصیه های مناسب را ارائه دهند، به عنوان مثال، در مورد از دست دادن یک بررسی برای null، یا برعکس، در مورد امکان حذف یک بررسی غیر ضروری که باعث مسدود شدن کد می شود. برای مثال، چنین حاشیه‌نویسی‌هایی توسط IntelliJ IDE و FindBugs پشتیبانی می‌شوند و در JSR 305 نیز گنجانده شده‌اند. اما حتی اگر IDE شما از چنین حاشیه‌نویسی پشتیبانی نکند، به خودی خود مستندات خوبی خواهند بود. با نگاه کردن به @NotNullو @Nullableبرای برنامه نویس آسان تر خواهد بود که بفهمد برای کجا چک اضافه کند nullو کجا نه. به هر حال، این یک روش نسبتاً جدید در بین برنامه نویسان جاوا است و گسترش آن زمان می برد.

از اتوباکس و اتوباکس غیر ضروری در کد خود اجتناب کنید

این نه تنها منجر به ایجاد اشیاء موقت غیر ضروری می شود، بلکه اتوباکسینگ همچنین می تواند یک NullPointerException ایجاد کند اگر کلاس wrapper باشد null. به عنوان مثال، اگر ورودی شخص حاوی شماره تلفن نباشد و برگرداند، کد زیر یک NullPointerException پرتاب می کند null.
Person ram = new Person("ram");
int phone = ram.getPhone();
هنگام استفاده از autoboxing یا autounboxing، نه تنها برابری‌ها، بلکه نابرابری‌ها نیز <می‌توانند >منجر به NullPointerException شوند.

از قراردادها پیروی کنید و پیش فرض های معقول را تعریف کنید.

یکی از بهترین راه‌ها برای جلوگیری از NullPointerException در جاوا، اعلام و پیروی مناسب از قراردادهای کدنویسی است. اکثر NullPointerException ها زمانی رخ می دهند که شما سعی می کنید یک شی را بدون داشتن تمام داده ها و وابستگی های مورد نیاز آن ایجاد کنید. با جلوگیری از ایجاد اشیاء ناتمام با رد دلپذیر چنین درخواست‌هایی، خود را از تعداد زیادی NullPointerExceptions در آینده نجات خواهید داد. به همین ترتیب، اگر اجازه ایجاد شی را می دهید، باید یک مقدار پیش فرض معقول را انتخاب کنید. به عنوان مثال، یک شی کلاس Employeeبدون نام و نمی تواند ایجاد شود id، اما ممکن است شماره تلفن نداشته باشد. در این مورد، اشیاء Employeeبدون عدد ممکن است به جای آن صفر برگردانند null. اگرچه چنین رفتاری از شیء باید از قبل در نظر گرفته شود - ممکن است بررسی آن آسان تر nullاز تماس با یک شماره غیر موجود باشد. در این صورت داشتن شرایط اضافی در مورد اینکه کدام رشته ها هستند nullو کدام ها نیستند به تصمیم گیری صحیح کمک می کند. به طور کلی، انتخاب بین از کار افتادن فوری برنامه یا تخصیص nullآن یک تصمیم مهم طراحی است و هنگامی که انتخاب کردید، باید به طور مداوم آن را دنبال کنید.

محدودیت ها را در سطح DBMS تنظیم کنید

هنگامی که از یک پایگاه داده برای ذخیره اشیاء برنامه خود مانند مشتریان یا سفارشات استفاده می کنید، عاقلانه است که " nullنیست" اشیاء خود را در سطح DBMS با استفاده از محدودیت های جدول مناسب مشخص کنید. پایگاه های داده اغلب حاوی اطلاعاتی از چندین منبع هستند و بررسی مقادیر از دست رفته باعث بهبود یکپارچگی داده های شما می شود. علاوه بر این، وجود بررسی‌های تهی در سطح DBMS باعث کاهش آنها در کد جاوا می‌شود: با بارگیری داده‌ها از پایگاه داده در اشیاء جاوا، می‌توانید از وجود آنها مطمئن شوید و " " غیر ضروری را != nullاز کد برنامه حذف کنید.

از الگوی شیء پوچ استفاده کنید

ایجاد Nullاشیاء ویژه راه دیگری برای جلوگیری از NullPointerExcpetition در جاوا است. بیایید فرض کنیم که برخی از متدها در برنامه ما شیئی را برمی گرداند که برنامه متعاقباً با فراخوانی متدهای آن کار می کند. به عنوان مثال، متد Collection.iterator()یک شی از کلاس Iteratorرا که برای تکرار در مجموعه استفاده می شود، برمی گرداند. سپس اگر شی اصلی هیچ تکرار کننده ای نداشته باشد، nullمی توانید به جای آن یک Null-object ویژه که دارای متدی است hasNext()که همیشه برمی گرداند، برگردانید false. این همه است، خواننده عزیز، در اینجا به نکات خود برای خلاص کردن برنامه های جاوا از خطاهای NullPointerException پایان می دهم. قدردان خواهید بود که این قوانین ساده و نه سنگین چقدر می توانند مفید باشند. به عنوان یادآوری، اگر می‌خواهید سایر ترفندهای NullPointerException را در برنامه‌های جاوا به اشتراک بگذارید، این کار را در نظرات انجام دهید. به طور خاص برای دانش آموزان JavaRush ترجمه شده است. اصل
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION