آج میں آپ کو اپنی ایپلی کیشنز میں NullPointerException سے بچنے کے لیے آسان تکنیک دکھاؤں گا۔ ان کی پیروی کرنا آسان ہے، لیکن آپ کے کوڈ کی وشوسنییتا اور معیار کو نمایاں طور پر بہتر بناتے ہیں۔ مزید یہ کہ، میرے تجربے میں، پہلی ٹپ آپ کے کوڈ کے معیار پر نمایاں اثر ڈالے گی۔ اگر آپ کو جاوا پروگرامنگ کی کوئی اور ترکیب معلوم ہے تو بلا جھجھک انہیں تبصروں میں شیئر کریں۔
بہت ساری اوپن سورس لائبریریاں ہیں جو کے لیے ٹیسٹنگ کا بھاری بوجھ اٹھاتی ہیں کسی طریقہ سے واپس نہ آنے کی کوشش کریں
یہ ایک اور اچھا جاوا پروگرامنگ ٹِپ ہے جسے جوشوا بلوچ نے اپنی کتاب Java: Effective Programming میں بیان کیا ہے۔ خالی مجموعوں یا صفوں کو واپس کرتے وقت، اس بات کو یقینی بنائیں کہ کال کرنے کے بنیادی طریقے 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()
ہر جگہ موجود ہے۔
ان صورتوں میں جہاں دونوں ایک ہی نتیجہ پیش کرتے ہیں ان صورتوں میں toString() پر ویلیو آف() کا انتخاب کریں۔
چونکہtoString()
قدر کے ساتھ کسی حوالہ پر کال کرنے null
سے ایک NullPointerException پھینکتا ہے، اس لیے کالنگ کا استعمال کرنا بہتر ہے valueOf()
جب ہم وہی نتیجہ حاصل کر سکیں، کیونکہ واپسی valueOf()
سے کال کرنا ۔ یہ خاص طور پر ریپر کلاسز کے لیے درست ہے جیسے , , or . null
null
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
اپاچی کامنز سے ہے۔ طریقوں کا استعمال کرتے ہوئے جیسے کہ 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 طلباء کے لیے ترجمہ کیا گیا۔ اصل
GO TO FULL VERSION