JavaRush /جاوا بلاگ /Random-SD /شروعاتي جاوا پروگرامرز جون غلطيون. حصو 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. شيون شروع ڪرڻ وساريو جيڪي صف جا عنصر آھن.

جاوا ۾، شين جو هڪ صف اصل ۾ اعتراض جي حوالن جو هڪ صف آهي. هڪ صف ٺاهڻ صرف حوالن جو هڪ سيٽ ٺاهي رهيو آهي جيڪو ڪنهن به شيءِ ڏانهن اشارو نه ڪندو آهي (يعني اهي null آهن). اصل ۾ شيون جي "مڪمل" صف ٺاهڻ لاء، توهان کي صف جي هر عنصر کي شروع ڪرڻ جي ضرورت آهي. ڪيترائي شاگرد اھا نه سمجھندا آھن؛ انهن کي يقين آهي ته شين جي هڪ صف پيدا ڪرڻ سان، اهي خودڪار طريقي سان شيون ٺاهي رهيا آهن. (اڪثر صورتن ۾، شاگرد اهو تصور 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 ڏسو) ڪڏهن ڪڏهن شاگرد 2 ضابطي جي باري ۾ وساريندا آهن، جنهن جي ڪري غلطيون ٿينديون آهن. اسٽيج تي گڏ ڪرڻ تي. 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;
    }
}
ھن غلطي کي درست ڪرڻ جا ڪيترائي طريقا آھن. سڀ کان سادو آهي ڪلاس فيلڊس تائين رسائي حاصل ڪرڻ لاءِ هڪ implicit pointer 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