CodeGym /جاوا بلاگ /Random-UR /مستثنیات: نشان زد، غیر نشان زد، اور حسب ضرورت
John Squirrels
سطح
San Francisco

مستثنیات: نشان زد، غیر نشان زد، اور حسب ضرورت

گروپ میں شائع ہوا۔
ہائے! پچھلے سبق میں، ہم جاوا زبان میں مستثنیات سے واقف ہوئے، اور ان کے ساتھ کام کرنے کے طریقے کی مثالیں دیکھیں۔ آج ہم مستثنیات کی ساخت پر گہرائی سے نظر ڈالیں گے، اور سیکھیں گے کہ اپنے استثنیات کو کیسے لکھنا ہے :)

مستثنیات کی اقسام

جیسا کہ ہم نے پہلے کہا، جاوا میں بہت سی مستثنیات ہیں، تقریباً 400! لیکن وہ سبھی گروہوں میں تقسیم ہیں، لہذا انہیں یاد رکھنا کافی آسان ہے۔ یہ اس طرح نظر آتا ہے: کلاس مستثنیات: نشان زد، غیر نشان زد، اور حسب ضرورت - 2 میں تمام مستثنیات کا ایک مشترکہ آباؤ اجداد ہوتا ہے ۔ Throwableاس سے دو بڑے گروہ اخذ کیے گئے ہیں: استثناء ( استثناء ) اور غلطیاں ( Errorایرر - یہ جاوا ورچوئل مشین کے آپریشن سے متعلق ایک اہم رن ٹائم غلطی کی نمائندگی کرتا ہے۔ زیادہ تر معاملات میں، ایرر کو سنبھالنے کی ضرورت نہیں ہے، کیونکہ یہ کوڈ میں کچھ سنگین خامیوں کی نشاندہی کرتا ہے۔ ان میں سب سے مشہور StackOverflowError ہیں (یہ اس وقت ہوتا ہے، مثال کے طور پر، جب کوئی طریقہ خود کو لامتناہی طور پر کال کرتا ہے) اور OutOfMemoryError (یہ اس وقت ہوتا ہے جب نئی اشیاء بنانے کے لیے کافی میموری نہ ہو)۔ جیسا کہ آپ دیکھ سکتے ہیں، ان حالات میں، عام طور پر رن ​​ٹائم پر ہینڈل کرنے کے لیے بالکل کچھ بھی نہیں ہوتا ہے: کوڈ صرف غلط لکھا گیا ہے اور اسے دوبارہ کام کرنے کی ضرورت ہے۔ استثناء - یہ ایک استثناء کی نمائندگی کرتا ہے: ایک غیر معمولی، غیر منصوبہ بند صورت حال جو اس وقت ہوتی ہے جب پروگرام چل رہا ہو۔ وہ غلطی کی طرح سنجیدہ نہیں ہیں، لیکن پھر بھی انہیں ہماری توجہ کی ضرورت ہے۔ تمام مستثنیات کو 2 اقسام میں تقسیم کیا گیا ہے: چیک شدہ اور غیر نشان زد ۔ مستثنیات: نشان زد، غیر نشان زد، اور حسب ضرورت - 3 تمام چیک شدہ مستثنیات Exceptionکلاس سے ماخوذ ہیں۔ "چیک شدہ" کا کیا مطلب ہے؟ ہم نے آخری سبق میں اس کی طرف اشارہ کیا تھا: "اس لیے جاوا کمپائلر سب سے عام استثناء اور ان حالات کو جانتا ہے جہاں وہ واقع ہو سکتے ہیں۔" مثال کے طور پر، یہ جانتا ہے کہ اگر کوڈ کسی فائل سے ڈیٹا پڑھتا ہے، تو فائل آسانی سے موجود نہیں ہوسکتی ہے۔ اور اس طرح کے بہت سے حالات ہیں (جن سے یہ اندازہ لگا سکتا ہے)۔ اس کے مطابق، مرتب کرنے والا ان ممکنہ استثناء کی موجودگی کے لیے ہمارے کوڈ کو پہلے سے چیک کرتا ہے۔ اگر یہ ان کو ڈھونڈتا ہے، تو یہ کوڈ کو اس وقت تک مرتب نہیں کرے گا جب تک کہ ہم انہیں ہینڈل نہ کر لیں یا انہیں دوبارہ پھینک دیں۔ استثناء کی دوسری قسم "غیر چیک شدہ" ہے۔ وہ RuntimeExceptionکلاس سے ماخوذ ہیں۔ وہ چیک شدہ مستثنیات سے کیسے مختلف ہیں؟ ایسا لگتا ہے کہ بہت ساری مختلف کلاسیں بھی ہیں جن سے اخذ کیا گیا ہے RuntimeException(جو رن ٹائم مستثنیات کو بیان کرتے ہیں)۔ فرق یہ ہے کہ مرتب کرنے والا ان غلطیوں کی توقع نہیں کرتا ہے۔ یہ کہتے ہوئے لگتا ہے کہ "جب کوڈ لکھا گیا تو مجھے کوئی مشکوک چیز نہیں ملی، لیکن چلتے وقت کچھ غلط ہو گیا۔ بظاہر، کوڈ میں غلطیاں ہیں!" اور واقعی یہ سچ ہے۔ غیر چیک شدہ مستثنیات اکثر پروگرامر کی غلطیوں کا نتیجہ ہوتے ہیں۔ اور مرتب کرنے والا ظاہر ہے کہ ہر ممکنہ خراب صورتحال کا اندازہ نہیں لگا سکتا جو لوگ اپنے ہاتھوں سے پیدا کر سکتے ہیں۔ :) لہذا، یہ اس بات کی جانچ نہیں کرتا ہے کہ آیا ہمارے کوڈ میں ایسی استثناء کو سنبھالا گیا ہے۔ آپ کو پہلے ہی کئی غیر نشان زد مستثنیات کا سامنا کرنا پڑا ہے:
  • صفر سے تقسیم کرتے وقت ریاضی کا استثناء ہوتا ہے۔
  • ایک ArrayIndexOutOfBoundsException اس وقت ہوتا ہے جب آپ صف سے باہر کسی پوزیشن تک رسائی حاصل کرنے کی کوشش کرتے ہیں۔
یقیناً، آپ تصور کر سکتے ہیں کہ جاوا کے تخلیق کاروں نے لازمی استثناء ہینڈلنگ متعارف کرایا ہو گا، لیکن اس صورت میں کوڈ بہت پیچیدہ ہو گا۔ try-catchکسی بھی ڈویژن آپریشن کے لیے، کیا آپ کو یہ چیک کرنے کے لیے ایک بلاک لکھنا پڑے گا کہ آیا آپ نے غلطی سے صفر سے تقسیم کر دیا ہے؟ try-catchجب بھی آپ نے کسی صف تک رسائی حاصل کی، آپ کو یہ چیک کرنے کے لیے ایک بلاک لکھنا پڑے گا کہ آیا آپ کا انڈیکس حد سے باہر ہے۔ ہر چیز اسپگیٹی کوڈ ہوگی اور مکمل طور پر پڑھنے کے قابل نہیں ہوگی۔ یہ سمجھ میں آتا ہے کہ یہ خیال ترک کردیا گیا تھا۔ try-catchنتیجے کے طور پر، غیر چیک شدہ مستثنیات کو بلاکس میں ہینڈل کرنے یا دوبارہ پھینکنے کی ضرورت نہیں ہے (حالانکہ یہ تکنیکی طور پر ممکن ہے، جیسا کہ ایرر ہے)۔

اپنی اپنی رعایت کو کیسے پھینکیں۔

یقیناً، جاوا کے تخلیق کار پروگراموں میں پیدا ہونے والی ہر غیر معمولی صورتحال کا اندازہ نہیں لگا سکتے۔ دنیا میں بہت سارے پروگرام ہیں، اور وہ بہت متنوع ہیں۔ لیکن اس کے بارے میں فکر کرنے کی کوئی بات نہیں ہے، کیونکہ اگر ضروری ہو تو آپ اپنا استثنیٰ تشکیل دے سکتے ہیں۔ یہ کرنا بہت آسان ہے۔ آپ کو بس اپنی کلاس بنانا ہے۔ آپ کو یقین ہونا چاہیے کہ اس کا نام "استثنیٰ" کے ساتھ ختم ہوتا ہے۔ مرتب کرنے والے کو اس کی ضرورت نہیں ہے، لیکن آپ کے کوڈ کو پڑھنے والے دوسرے پروگرامر فوراً سمجھ جائیں گے کہ یہ ایک استثنائی کلاس ہے۔ اس کے علاوہ، اشارہ کریں کہ کلاس Exceptionکلاس سے وراثت میں ملی ہے (مرتب کو اس کی ضرورت ہے)۔ مثال کے طور پر، فرض کریں کہ ہمارے پاس ایک Dogکلاس ہے۔ ہم طریقہ استعمال کرتے ہوئے کتے کو چل سکتے ہیں walk()۔ لیکن ایسا کرنے سے پہلے، ہمیں یہ چیک کرنے کی ضرورت ہے کہ آیا ہمارے پالتو جانور نے کالر، پٹا اور توتن پہنا ہوا ہے۔ اگر اس گیئر میں سے کوئی بھی غائب ہے، تو ہم اپنا استثناء پھینک دیتے ہیں: DogIsNotReadyException ۔ اس کا کوڈ اس طرح لگتا ہے:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
یہ بتانے کے لیے کہ کلاس ایک استثنیٰ ہے، آپ کو کلاس کے نام کے بعد " exceptions Exception " لکھنا ہوگا (اس کا مطلب ہے "کلاس Exception class سے ماخوذ ہے")۔ کنسٹرکٹر میں، ہم صرف Exceptionاسٹرنگ میسج کے ساتھ کلاس کنسٹرکٹر کو کال کرتے ہیں (اگر استثناء ہوتا ہے، تو ہم صارف کو پیغام، غلطی کی تفصیل، دکھائیں گے)۔ یہ ہمارے کلاس کوڈ میں کیسا لگتا ہے:
public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;


   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("We're getting ready for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hooray, let's go for a walk! " + name + " is very happy!");
   } else {
       throw new DogIsNotReadyException(name + " is not ready for a walk! Check the gear!");
   }
 }

}
اب ہمارا walk()طریقہ DogIsNotReadyException پھینکتا ہے ۔ یہ کلیدی لفظ تھرو کے ساتھ کیا جاتا ہے۔ جیسا کہ ہم نے پہلے کہا، ایک استثناء ایک چیز ہے۔ لہذا، جب ہمارے طریقہ کار میں کوئی استثناء واقع ہوتا ہے (کتے میں کچھ کمی ہوتی ہے)، تو ہم ایک نئی DogIsNotReadyExceptionچیز بناتے ہیں اور مطلوبہ الفاظ کے تھرو کا استعمال کرتے ہوئے اسے پھینک دیتے ہیں۔ ہم طریقہ کے اعلان میں " throws DogIsNotReadyException " شامل کرتے ہیں۔ دوسرے لفظوں میں، اب مرتب کرنے والے کو معلوم ہے کہ walk()طریقہ کو کال کرنا ایک غیر معمولی صورتحال میں بدل سکتا ہے۔ اس کے مطابق، اگر ہم اس طریقہ کو اپنے پروگرام میں کہیں کہتے ہیں تو اس استثناء کو سنبھالا جانا چاہیے۔ آئیے اسے main()طریقہ کار میں کرنے کی کوشش کریں:
public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
یہ مرتب نہیں ہوگا۔ رعایت سنبھالا نہیں ہے! ہم try-catchاستثنا کو سنبھالنے کے لیے اپنے کوڈ کو ایک بلاک میں لپیٹتے ہیں:
public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking the gear! Is the collar on? " + dog.isCollarPutOn + "\r\n Is the leash on? "
       + dog.isLeashPutOn + "\r\n Is the muzzle on? " + dog.isMuzzlePutOn);
   }
}
اب کنسول آؤٹ پٹ کو دیکھتے ہیں: کالر آن ہے! منہ بند ہے! ہم سیر کے لیے تیار ہو رہے ہیں! دوست سیر کے لیے تیار نہیں ہے! گیئر چیک کریں! گیئر چیک کر رہا ہے! کیا کالر آن ہے؟ سچ ہے پٹا پر ہے؟ جھوٹ کیا توتن آن ہے؟ سچ دیکھو کہ کنسول آؤٹ پٹ کتنا زیادہ معلوماتی تھا! ہم پروگرام میں اٹھائے گئے ہر قدم کو دیکھتے ہیں۔ ہم دیکھتے ہیں کہ غلطی کہاں ہوئی ہے، اور ہم فوری طور پر یہ بھی دیکھ سکتے ہیں کہ ہمارے کتے میں کیا کمی ہے۔ :) اور اس طرح آپ اپنے استثناء کو تخلیق کرتے ہیں۔ جیسا کہ آپ دیکھ سکتے ہیں، اس میں کوئی پیچیدہ بات نہیں ہے۔ اور اگرچہ جاوا کے تخلیق کاروں نے زبان میں ناقص لیس کتوں کے لیے خصوصی رعایت شامل کرنے کی زحمت نہیں کی، ہم نے ان کی نگرانی کو ٹھیک کر دیا ہے۔ :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION