JavaRush /جاوا بلاگ /Random-UR /چالیں اور نکات۔ جاوا ایپلی کیشنز میں 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()ہر جگہ موجود ہے۔

ان صورتوں میں جہاں دونوں ایک ہی نتیجہ پیش کرتے ہیں ان صورتوں میں toString() پر ویلیو آف() کا انتخاب کریں۔

چونکہ toString()قدر کے ساتھ کسی حوالہ پر کال کرنے nullسے ایک NullPointerException پھینکتا ہے، اس لیے کالنگ کا استعمال کرنا بہتر ہے valueOf()جب ہم وہی نتیجہ حاصل کر سکیں، کیونکہ واپسی valueOf()سے کال کرنا ۔ یہ خاص طور پر ریپر کلاسز کے لیے درست ہے جیسے , , or . nullnullIntegerFloatDoubleBigDecimal
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اپاچی کامنز سے ہے۔ طریقوں کا استعمال کرتے ہوئے جیسے کہ StringUtils.isBlank()، وغیرہ۔ آپ کو NullPointerException پھینکنے کے بارے میں فکر کرنے کی ضرورت نہیں ہے۔ isNumeric()isWhiteSpace()
//Методы 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));
آؤٹ پٹ: سچ سچ جھوٹ جھوٹnull اور پھر بھی، استعمال کرنے سے پہلے، محفوظ طریقوں اور کلاسوں کی دستاویزات کو پڑھنا نہ بھولیں ۔ یہ جاوا کی ایک اور بہترین چال ہے جو زیادہ محنت کی ضرورت کے بغیر بڑی بہتری کی طرف لے جاتی ہے۔

کسی طریقہ سے واپس نہ آنے کی کوشش کریں null، بہتر ہے کہ خالی مجموعے کو واپس کریں۔

یہ ایک اور اچھا جاوا پروگرامنگ ٹِپ ہے جسے جوشوا بلوچ نے اپنی کتاب Java: Effective Programming میں بیان کیا ہے۔ خالی مجموعوں یا صفوں کو واپس کرتے وقت، اس بات کو یقینی بنائیں کہ کال کرنے کے بنیادی طریقے 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یا نہیں۔ جدید مرتب کرنے والے اور IDEs ان تشریحات کو آپ کے کوڈ کا تجزیہ کرنے اور مناسب مشورہ دینے کے لیے استعمال کر سکتے ہیں، مثال کے طور پر، کے لیے ایک چیک غائب ہونے کے بارے میں null، یا اس کے برعکس، کوڈ کو بند کرنے والے غیر ضروری چیک کو ہٹانے کے امکان کے بارے میں۔ مثال کے طور پر اس طرح کی تشریحات کو IntelliJ IDE اور FindBugs سے تعاون حاصل ہے، اور وہ JSR 305 میں بھی شامل ہیں۔ لیکن اگر آپ کا IDE ایسی تشریحات کو سپورٹ نہیں کرتا ہے، تب بھی یہ اپنے آپ میں اچھی دستاویز ہوں گی۔ دیکھ کر @NotNullاور @Nullableپروگرامر کے لیے یہ سمجھنا آسان ہو جائے گا کہ کہاں چیک شامل کرنا ہے nullاور کہاں نہیں۔ یہ، ویسے، جاوا پروگرامرز کے درمیان کافی نئی پریکٹس ہے، اور اسے پھیلنے میں وقت لگے گا۔

اپنے کوڈ میں غیر ضروری آٹو باکسنگ اور آٹو ان باکسنگ سے گریز کریں۔

یہ نہ صرف غیر ضروری عارضی اشیاء کی تخلیق کا باعث بنتا ہے، بلکہ آٹو باکسنگ بھی NullPointerException پھینک سکتی ہے اگر ریپر کلاس ہے null۔ مثال کے طور پر، مندرجہ ذیل کوڈ NullPointerException کو پھینک دے گا اگر فرد کے اندراج میں فون نمبر نہیں ہے اور واپس آتا ہے null۔
Person ram = new Person("ram");
int phone = ram.getPhone();
آٹو باکسنگ یا آٹو ان باکسنگ استعمال کرتے وقت، نہ صرف مساوات، بلکہ عدم مساوات <> >کے نتیجے میں NullPointerException ہو سکتا ہے۔

کنونشنز پر عمل کریں اور معقول ڈیفالٹس کی وضاحت کریں۔

جاوا میں NullPointerException سے بچنے کے بہترین طریقوں میں سے ایک کوڈنگ کنونشنز کا صحیح طور پر اعلان اور ان پر عمل کرنا ہے۔ زیادہ تر NullPointerExceptions اس وقت ہوتی ہیں جب آپ کسی چیز کو تمام ڈیٹا اور انحصار کے بغیر بنانے کی کوشش کرتے ہیں۔ ایسی درخواستوں کو احسن طریقے سے مسترد کر کے نامکمل اشیاء کی تخلیق کو روک کر، آپ مستقبل میں NullPointerExceptions کی ایک بڑی تعداد سے خود کو بچائیں گے۔ اسی طرح، اگر آپ آبجیکٹ بنانے کی اجازت دیتے ہیں، تو آپ کو ایک مناسب ڈیفالٹ قدر کا انتخاب کرنا چاہیے۔ مثال کے طور پر، ایک کلاس آبجیکٹ Employeeنام کے بغیر نہیں بنایا جا سکتا اور idہو سکتا ہے کہ اس کا فون نمبر نہ ہو۔ Employeeاس صورت میں، عدد کے بغیر اشیاء صفر کی بجائے واپس آ سکتی ہیں null۔ اگرچہ آبجیکٹ کے اس طرح کے رویے کے بارے میں پہلے سے سوچا جانا چاہئے - nullغیر موجود نمبر پر کال کرنے کے بجائے اس کی جانچ کرنا آسان ہوسکتا ہے۔ اس صورت میں، اضافی شرائط کا ہونا nullصحیح فیصلہ کرنے میں مدد کرے گا کہ کون سے فیلڈز ہیں اور کون سے نہیں۔ عام طور پر، پروگرام کو فوری طور پر کریش کرنے یا اسے تفویض کرنے کے درمیان انتخاب nullایک اہم ڈیزائن کا فیصلہ ہے، اور ایک بار جب آپ انتخاب کر لیتے ہیں، تو آپ کو اس کی مسلسل پیروی کرنی چاہیے۔

ڈی بی ایم ایس کی سطح پر پابندیاں لگائیں۔

اپنے پروگرام کی اشیاء کو ذخیرہ کرنے کے لیے ڈیٹا بیس کا استعمال کرتے وقت، جیسا کہ کسٹمرز یا آرڈرز، nullمناسب ٹیبل پابندیوں کا استعمال کرتے ہوئے، DBMS کی سطح پر اپنی اشیاء کی "ness" کی وضاحت کرنا دانشمندی ہے۔ ڈیٹا بیس میں اکثر متعدد ذرائع سے معلومات ہوتی ہیں، اور گمشدہ اقدار کے لیے چیک متعارف کروانا آپ کے ڈیٹا کی سالمیت کو بہتر بنائے گا۔ اس کے علاوہ، DBMS سطح پر null کے لیے چیک کی موجودگی آپ کے جاوا کوڈ میں ان کو کم کر دے گی: ڈیٹا بیس سے جاوا آبجیکٹ میں ڈیٹا لوڈ کر کے، آپ ان کی موجودگی کا یقین کر سکتے ہیں اور != nullپروگرام کوڈ سے غیر ضروری " " کو ہٹا سکتے ہیں۔

Null آبجیکٹ پیٹرن استعمال کریں۔

Nullجاوا میں NullPointerExcpetition سے بچنے کا ایک اور طریقہ ہے special-objects بنانا ۔ آئیے فرض کریں کہ ہماری ایپلی کیشن میں کوئی طریقہ ایک ایسی چیز کو واپس کرتا ہے جس کے ساتھ پروگرام بعد میں اس کے طریقوں کو کال کرکے کام کرتا ہے۔ مثال کے طور پر، طریقہ Collection.iterator()کلاس کے ایک آبجیکٹ کو لوٹاتا ہے Iteratorجو مجموعہ کے ذریعے اعادہ کرنے کے لیے استعمال ہوتا ہے۔ پھر اگر اصل آبجیکٹ میں کوئی تکرار کرنے والا نہیں ہے، تو nullآپ اس کے بجائے ایک خاص Null-آبجیکٹ واپس کر سکتے ہیں جس کا ایک طریقہ ہے hasNext()جو ہمیشہ واپس آتا ہے false۔ پیارے قارئین، بس یہی ہے جہاں میں جاوا پروگراموں کو NullPointerException کی غلطیوں سے نجات دلانے کے لیے اپنی تجاویز ختم کرتا ہوں۔ آپ اس بات کی تعریف کریں گے کہ یہ سادہ اور بوجھل قوانین کتنے مفید ہو سکتے ہیں۔ یاد دہانی کے طور پر، اگر آپ جاوا پروگراموں میں کوئی اور NullPointerException ٹرکس شیئر کرنا چاہتے ہیں، تو بلا جھجھک تبصروں میں ایسا کریں۔ خاص طور پر JavaRush طلباء کے لیے ترجمہ کیا گیا۔ اصل
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION