JavaRush /جاوا بلاگ /Random-UR /ابتدائی جاوا پروگرامرز کی غلطیاں۔ حصہ 1
articles
سطح

ابتدائی جاوا پروگرامرز کی غلطیاں۔ حصہ 1

گروپ میں شائع ہوا۔

1. کلاس کا نام اس فائل کے نام سے مختلف ہے جس میں یہ محفوظ ہے۔

تمام جاوا فریم ورک جو میں نے استعمال کیے ہیں، بشمول Javasoft JDKs، فرض کرتے ہیں کہ پبلک موڈیفائر والی کلاس کا سورس کوڈ بالکل اسی نام کے ساتھ ایک فائل میں اسٹور کیا جاتا ہے جس کا نام کلاس کا نام اور ایک .java ایکسٹینشن ہے۔ اس کنونشن کی پیروی کرنے میں ناکامی بہت سے مسائل کا سبب بن سکتی ہے جو تالیف کے دوران ظاہر ہوں گی۔
ابتدائی جاوا پروگرامرز کی غلطیاں۔  حصہ 1 - 1
ابتدائی طلباء (پروگرامرز) اکثر اس کنونشن کو بھول جاتے ہیں اور مثال کے طور پر اسائنمنٹ کے مطابق فائل کا نام سیٹ کریں: Lab6.java۔ غلط مثال: فائل کا نامLab6.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
درست مثال: فائل کا نامAirplane.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
براہ مہربانی نوٹ کریں:کلاس کا نام بڑے حروف سے شروع ہوتا ہے۔ آپریٹنگ سسٹم جو فائل کے ناموں میں کیس حساس ہوتے ہیں اضافی مسائل پیش کر سکتے ہیں، خاص طور پر یونکس پر جاوا سیکھنے والے طلباء کے لیے جو DOS فائل کے نام کے نظام کے عادی ہیں۔ کلاس کو MotorVehicleفائل میں محفوظ کیا جانا چاہئے MotorVehicle.java، لیکن ایک میں نہیں motorvehicle.java۔

2. موازنہ کا استعمال کرتے ہوئے==

جاوا میں، سٹرنگ کلاس کی اشیاء ہیں java.lang.String۔ آپریٹر نے ==اشیاء کے حوالہ جات کی مساوات کے لئے آبجیکٹ چیکس پر درخواست دی! بعض اوقات طلباء آپریٹر کی اصطلاحات کو نہیں سمجھتے ==اور اسے تاروں کا موازنہ کرنے کے لیے استعمال کرنے کی کوشش کرتے ہیں۔ غلط مثال:
// проверим, equals ли первый аргумент "-a"
if (args[0] == "-a") {
    optionsAll = true;
}
مساوات کے لیے 2 تاروں کا موازنہ کرنے کا صحیح طریقہ equals()کلاس طریقہ استعمال کرنا ہے java.lang.String۔ یہ واپس آتا ہے trueاگر تار ایک ہی لمبائی کے ہوں اور ایک جیسے حروف پر مشتمل ہوں۔ (نوٹ: درحقیقت یہ مساوات کی ضمانت نہیں دیتا۔ درحقیقت، equalsیہ جانچتا ہے کہ آیا 2 سٹرنگ کردار کے لحاظ سے برابر ہیں) درست مثال:
//  проверим, equals ли первый аргумент "-a"
if ("-a".equals(args[0])) {
    optionsAll = true;
}
یہ غلطی احمقانہ ہے، کیونکہ حقیقت میں جاوا کوڈ نحوی طور پر درست نکلا، لیکن آخر میں یہ توقع کے مطابق کام نہیں کرتا۔ کچھ طلباء کلاس کے طریقہ کار کے بجائے >اور موازنہ آپریٹرز کو استعمال کرنے کی بھی کوشش کرتے ہیں ۔ اس غلطی کا پتہ لگانا آسان ہے کیونکہ یہ تالیف کے مرحلے کے دوران غلطیوں کا سبب بنتا ہے۔ <=compareTo()java.lang.String

3. وہ اشیاء شروع کرنا بھول گئے جو صف کے عناصر ہیں۔

جاوا میں، اشیاء کی ایک صف دراصل آبجیکٹ کے حوالوں کی ایک صف ہے۔ ایک صف بنانا صرف حوالہ جات کا ایک سیٹ بنانا ہے جو کسی چیز کی طرف اشارہ نہیں کرتا ہے (یعنی وہ کالعدم ہیں)۔ اصل میں اشیاء کی "مکمل" صف بنانے کے لیے، آپ کو صف کے ہر عنصر کو شروع کرنے کی ضرورت ہے۔ بہت سے طلباء یہ نہیں سمجھتے۔ ان کا ماننا ہے کہ اشیاء کی ایک صف بنا کر، وہ خود بخود اشیاء خود بنا لیتے ہیں۔ (زیادہ تر صورتوں میں، طلباء یہ تصور C++ سے لاتے ہیں، جہاں اشیاء کی ایک صف بنانے کے نتیجے میں وہ اپنے ڈیفالٹ کنسٹرکٹر کو کال کرکے خود ہی اشیاء تخلیق کرتے ہیں۔) نیچے دی گئی مثال میں، طالب علم کلاس کی 3 اشیاء بنانا چاہتا ہے StringBuffer۔ کوڈ غلطیوں کے بغیر مرتب کرے گا، لیکن آخری لائن میں ایک استثناء واقع ہوگا NullPointerException، جہاں ایک غیر موجود چیز تک رسائی حاصل کی گئی ہے۔ غلط مثال:
// Создаем массив из StringBuffer
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
myTempBuffers[0].add(data);
اس غلطی سے بچنے کے لیے، آپ کو سرنی عناصر کو شروع کرنا یاد رکھنا چاہیے۔ درست مثال:
// Создаем массив из StringBuffer и инициализируем элементы
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
for (int ix = 0; ix < myTempBuffers.length; ix++)
     myTempBuffers[ix] = new StringBuffer();

myTempBuffers[0].add(data);

4. ایک فائل میں ایک ہی وقت میں متعدد کلاسز کو ایک ترمیم کنندہ کے ساتھ رکھناpublic

جاوا سورس فائلیں ان فائلوں میں موجود کلاسز کے ساتھ مخصوص طریقوں سے وابستہ ہیں۔ تعلق کو اس طرح بیان کیا جا سکتا ہے: جاوا کی کوئی بھی کلاس ایک سے زیادہ فائلوں میں محفوظ نہیں ہوتی۔ کسی بھی سورس کوڈ فائل میں آپ موڈیفائر کے ساتھ 1 کلاس سے زیادہ نہیں رکھ سکتے ہیں public۔ اگر سورس کوڈ فائل میں ترمیم کرنے والے کے ساتھ کلاس ہے تو public، فائل کا نام اور کلاس کا نام سختی سے ایک جیسا ہونا چاہیے (ترجمہ نوٹ: اپ ٹو کیس، پوائنٹ 1 دیکھیں) بعض اوقات طلباء دوسرے اصول کو بھول جاتے ہیں، جس کی وجہ سے غلطیاں ہوتی ہیں۔ تالیف کے مرحلے میں۔ 2nd اور 3rd قواعد کے لیے غلطی کا پیغام ایک جیسا ہو گا (جو دراصل اس غلطی کو پہچاننا مشکل بناتا ہے)۔

5. مقامی متغیر کے ساتھ کلاس فیلڈ کا متبادل۔

جاوا آپ کو ایک طریقہ کے اندر متغیرات کا اعلان کرنے کی اجازت دیتا ہے جس کا نام کلاس کے فیلڈز سے ملتا ہے۔ اس صورت میں، مقامی متغیرات کو ترجیح دی جائے گی اور فیلڈز کی بجائے استعمال کیا جائے گا۔ اگر ایک ہی نام کے متغیرات مختلف قسم کے ہوں تو مرتب کرنے والا غلطی کرے گا۔ اگر وہ ایک ہی قسم کے ہیں، تو تالیف کی کوئی خرابی نہیں ہوگی، اور پروگرام کے غلط آپریشن کی وجوہات واضح نہیں ہوں گی۔ غلط مثال:
public class Point3 {
    int i = 0;
    int j = 0;
    int k = 0;

    public boolean hits(Point[] p2list) {
      for(int i = 0; i < p2list.length; i++) {
        Point p2 = p2list[i];
        if (p2.x == i && p2.y == j)
          return true;
      }
      return false;
    }
}
اس غلطی کو ٹھیک کرنے کے کئی طریقے ہیں۔ سب سے آسان ایک مضمر پوائنٹر کا استعمال کرتے ہوئے کلاس فیلڈز تک رسائی حاصل کرنا ہے this: this.Name_поля۔ بہترین طریقہ یہ ہے کہ کلاس فیلڈ یا لوکل متغیر کا نام تبدیل کیا جائے، پھر متبادل نہیں ہوگا۔ (تقریباً ترجمہ: دوسرا طریقہ ہمارا طریقہ نہیں ہے۔ مزید یہ کہ یہ اس بات کی ضمانت نہیں دیتا کہ میں کسی دن اتفاقی طور پر متغیر کی فیلڈ کو تبدیل نہیں کروں گا۔ وراثت کے ساتھ اس سے بھی بڑی مشکل پیدا ہوتی ہے، جب میں یہ نہیں دیکھتا کہ کون سے فیلڈز ہیں؟ کلاس میں ہے ) درست مثال:
// One way to fix the problem
  int i = 0;
  int j = 0;
  int k = 0;

  public boolean hits(Point[] p2list) {
    for(int i = 0; i < p2list.length; i++) {
      Point p2 = p2list[i];
      if (p2.x == this.i && p2.y == this.j)
        return true;
    }
    return false;
  }

  // *****************************
  // Лучший способ
  int x = 0;
  int y = 0;
  int z = 0;

  public boolean hits(Point[] p2list) {
    for(int i = 0; i < p2list.length; i++) {
      Point p2 = p2list[i];
      if (p2.x == x && p2.y == y)
        return true;
    }
    return false;
  }
اس خرابی کے پیش آنے کی ایک اور ممکنہ جگہ طریقہ پیرامیٹر کے نام کو کلاس فیلڈ کے نام کی طرح سیٹ کرنا ہے۔ یہ کنسٹرکٹرز میں اچھا لگتا ہے، لیکن عام طریقوں کے لیے موزوں نہیں ہے۔

تقریبا. ترجمہ

تھوڑا سا افراتفری، لیکن یہ خلاصہ ہے

public class Test {
   private int param = 0;

   public Test(int param) {
      this.param = param;
   }
}

یعنی کنسٹرکٹر میں ہر چیز خوبصورت نظر آتی ہے، لیکن اسے عام طریقوں کے لیے استعمال نہیں کیا جانا چاہیے۔

6. پیرنٹ (سپر کلاس) کنسٹرکٹر کو کال کرنا بھول گئے۔

جب ایک کلاس دوسری کلاس کو بڑھاتی ہے، تو ہر ذیلی کلاس کنسٹرکٹر کو کچھ سپر کلاس کنسٹرکٹر کو کال کرنا چاہیے۔ super(x)یہ عام طور پر کنسٹرکٹر کی پہلی لائن پر رکھے گئے طریقہ کے ساتھ سپر کلاس کنسٹرکٹر کو کال کرکے حاصل کیا جاتا ہے ۔ اگر کنسٹرکٹر کی پہلی لائن میں کوئی کال نہیں ہے تو super(x)، مرتب کرنے والا خود اس کال کو داخل کرتا ہے، لیکن پیرامیٹرز کے بغیر: super()۔ (تقریبا ٹرانس.: x...se، لیکن میں نہیں جانتا تھا) بعض اوقات طلباء اس ضرورت کو بھول جاتے ہیں۔ عام طور پر یہ کوئی مسئلہ نہیں ہے: سپر کلاس کنسٹرکٹر کو کال کمپائلر کے ذریعہ داخل کی جاتی ہے اور سب کچھ ٹھیک کام کرتا ہے۔ تاہم، اگر سپر کلاس میں ڈیفالٹ کنسٹرکٹر نہیں ہے، تو کمپائلر ایک غلطی پھینک دے گا۔ ذیل کی مثال میں، تمام سپر کلاس کنسٹرکٹرز کے java.io.Fileپاس 1 یا 2 پیرامیٹرز ہیں: غلط مثال:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        classname = cl;
    }
}
مسئلے کا حل یہ ہے کہ صحیح سپر کلاس کنسٹرکٹر کو ایک واضح کال داخل کی جائے: درست مثال:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        super(cl + ".class");
        classname = cl;
    }
}
ایک زیادہ ناخوشگوار صورتحال اس وقت ہوتی ہے جب سپر کلاس میں ڈیفالٹ کنسٹرکٹر ہوتا ہے، لیکن یہ آبجیکٹ کو مکمل طور پر شروع نہیں کرتا ہے۔ اس صورت میں، کوڈ مرتب ہو جائے گا، لیکن پروگرام کا آؤٹ پٹ غلط ہو سکتا ہے یا کوئی استثناء ہو سکتا ہے۔

7. مستثنیات کو غلط طریقے سے پکڑنا

جاوا کا استثنیٰ ہینڈلنگ سسٹم کافی طاقتور ہے، لیکن ابتدائی افراد کے لیے سمجھنا مشکل ہے۔ جو طلباء C++ یا Ada میں ماہر ہیں انہیں عام طور پر C اور Fortran پروگرامرز جیسی مشکلات کا سامنا نہیں کرنا پڑتا۔ ذیل کی مثالیں کچھ عام غلطیاں دکھاتی ہیں۔ اس مثال میں، استثناء کا نام نہیں دیا گیا ہے۔ کمپائلر تالیف کے مرحلے پر اس غلطی کی نشاندہی کرے گا، لہذا اسے خود ٹھیک کرنا آسان ہے۔ غلط مثال:
try {
    stream1 = new FileInputStream("data.txt");
} catch (IOException) {
    message("Could not open data.txt");
}
درست مثال:
try {
   stream1 = new FileInputStream("data.txt");
} catch (IOException ie) {
   message("Could not open data.txt: " + ie);
}
بلاکس کی ترتیب catchاس ترتیب کا تعین کرتی ہے جس میں مستثنیات پکڑے جاتے ہیں۔ اس بات کو ذہن میں رکھنا ضروری ہے کہ اس طرح کا ہر بلاک مخصوص کلاس یا اس کے کسی ذیلی طبقے کے تمام استثناء کو پکڑے گا۔ اگر آپ اسے دھیان میں نہیں لیتے ہیں، تو آپ ایک ناقابل رسائی کیچ بلاک کے ساتھ ختم ہو سکتے ہیں، جسے مرتب کرنے والا اشارہ کرے گا۔ ذیل کی مثال میں SocketExceptionکا ذیلی طبقہ ہے IOException۔ غلط مثال:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (IOException ie) {
    message("Error accepting connection.");
} catch (SocketException se) {
    message("Error setting time-out.");
}
درست مثال:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (SocketException se) {
    message("Error setting time-out.");
} catch (IOException ie) {
    message("Error accepting connection.");
}
اگر یہ ممکن ہے کہ آپ کے کوڈ میں کسی استثناء کا واقع ہو جسے کسی بلاک نے نہیں پکڑا ہے try-catch، تو اس استثناء کا اعلان طریقہ ہیڈر میں کیا جانا چاہیے۔ RuntimeException( یہ استثناء کے لیے ضروری نہیں ہے - کلاس کے ذیلی طبقات )۔ طلباء بعض اوقات یہ بھول جاتے ہیں کہ کسی طریقہ کو کال کرنے سے استثنیٰ ہوسکتا ہے۔ اسے ٹھیک کرنے کا سب سے آسان طریقہ یہ ہے کہ میتھڈ کال کو بلاک میں رکھا جائے try-catch۔ غلط مثال:
public void waitFor(int sec) {
    Thread.sleep(sec * 1000);
}
درست مثال:
public void waitFor(int sec) throws InterruptedException {
    Thread.sleep(sec * 1000);
}

8. رسائی کے طریقہ کار کی ایک قسم ہے۔void

یہ بہت سادہ غلطی ہے۔ طالب علم متغیر تک رسائی کے لیے ایک طریقہ تیار کرتا ہے، لیکن یہ بتاتا ہے کہ طریقہ کچھ بھی نہیں لوٹاتا ہے ( voidمیتھڈ ہیڈر میں ایک ترمیم کنندہ رکھتا ہے)۔ اس خرابی کو ٹھیک کرنے کے لیے، آپ کو واپسی کی صحیح قسم کی وضاحت کرنی ہوگی۔ غلط مثال:
public class Line {
    private Point start, end;
    public void getStart() {
      return start;
    }
}
درست مثال:
public class Line {
    private Point start, end;
    public Point getStart() {
      return start;
    }
}
غلط واپسی کی قسم کی وضاحت کرنے سے غلطیوں کی پوری کلاس پیدا ہوتی ہے۔ عام طور پر مرتب کرنے والا ان غلطیوں کو پہچانے گا اور ان کی اطلاع دے گا تاکہ طلباء خود ان کو درست کر سکیں۔ مصنف: A. Grasoff™ تسلسل پڑھیں ماخذ کا لنک: ابتدائی جاوا پروگرامرز کی غلطیاں
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION