JavaRush /جاوا بلاگ /Random-UR /مستثنیات: نشان زد، غیر نشان زد اور آپ کا اپنا

مستثنیات: نشان زد، غیر نشان زد اور آپ کا اپنا

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

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

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

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

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

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
یہ بتانے کے لیے کہ کلاس ایک استثناء ہے، آپ کو کلاس کے نام کے بعد Exception Exception لکھنے کی ضرورت ہے : اس کا مطلب ہے کہ "کلاس Exception کلاس سے ماخوذ ہے۔" کنسٹرکٹر میں، ہم کلاس کنسٹرکٹر کو صرف Exceptionایک لائن کے ساتھ کال کریں گے message- یہ صارف کو سسٹم کی طرف سے ایک پیغام دکھائے گا جس میں پیش آنے والی غلطی کو بیان کیا جائے گا۔ یہ ہمارے کلاس کوڈ میں ایسا نظر آئے گا:
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("Let's go for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hurrah, let's go for a walk!" + name + " I am glad!");
   } else {
       throw new DogIsNotReadyException("Dog " + name + "not ready for a walk! Check your gear!");
   }
 }

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

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

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking equipment! Is the collar on?" + dog.isCollarPutOn + "\r\n Is the leash on?"
       + dog.isLeashPutOn + "\r\n Are you wearing a muzzle?" + dog.isMuzzlePutOn);
   }
}
اب کنسول آؤٹ پٹ کو دیکھتے ہیں:

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
دیکھو کنسول آؤٹ پٹ کتنا زیادہ معلوماتی ہو گیا ہے! ہم پروگرام میں ہونے والے ہر قدم کو دیکھتے ہیں۔ ہم دیکھتے ہیں کہ غلطی کہاں ہوئی ہے اور فوری طور پر نوٹس لیتے ہیں کہ ہمارے کتے میں بالکل کیا کمی ہے :) اس طرح ہم اپنے استثناء پیدا کرتے ہیں۔ جیسا کہ آپ دیکھ سکتے ہیں، کچھ بھی پیچیدہ نہیں ہے. اور اگرچہ جاوا کے ڈویلپرز نے غلط طریقے سے لیس کتوں کے لیے اپنی زبان میں کوئی خاص رعایت شامل کرنے کی زحمت نہیں کی، ہم نے ان کی نگرانی کو درست کیا :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION