امروز تکنیک های ساده ای را به شما نشان خواهم داد که چگونه از NullPointerException در برنامه های خود اجتناب کنید. دنبال کردن آنها آسان است، اما به طور قابل توجهی قابلیت اطمینان و کیفیت کد شما را بهبود می بخشد. علاوه بر این، در تجربه من، اولین نکته تأثیر قابل توجهی بر کیفیت کد شما خواهد داشت. اگر ترفندهای برنامه نویسی جاوا دیگری را می شناسید، در نظرات به اشتراک بگذارید.
بسیاری از کتابخانه های منبع باز وجود دارند که بار سنگین آزمایش را بر عهده می گیرند سعی کنید از یک متد برنگردید
این یکی دیگر از نکات خوب برنامه نویسی جاوا است که جاشوا بلوخ در کتاب جاوا: برنامه نویسی موثر توضیح داده است. هنگام برگرداندن مجموعهها یا آرایههای خالی، مطمئن شوید که فراخوانی متدهای پایه مانند NullPointerException است
فراخوانی متدهای 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_MAP
null
از حاشیه نویسی @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 ترجمه شده است. اصل
GO TO FULL VERSION