JavaRush /Blog Java /Random-MS /Kesilapan pengaturcara java pemula. Bahagian 1
articles
Tahap

Kesilapan pengaturcara java pemula. Bahagian 1

Diterbitkan dalam kumpulan

1. Nama kelas adalah berbeza daripada nama fail di mana ia disimpan

Semua rangka kerja java yang saya gunakan, termasuk Javasoft JDK, menganggap bahawa kod sumber untuk kelas dengan pengubah suai awam disimpan dalam fail dengan nama yang betul-betul sama dengan nama kelas dan sambungan .java. Kegagalan untuk mengikuti konvensyen ini boleh menyebabkan banyak masalah yang akan muncul semasa penyusunan.
Kesilapan pengaturcara java pemula.  Bahagian 1 - 1
Pelajar permulaan (pengaturcara) sering lupa tentang konvensyen ini dan, sebagai contoh, tetapkan nama fail mengikut tugasan: Lab6.java. Contoh yang salah: Nama failLab6.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
Contoh yang diperbetulkan: Nama failAirplane.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
Sila ambil perhatian:nama kelas diandaikan bermula dengan huruf besar. Sistem pengendalian yang sensitif huruf besar dalam nama fail mungkin menimbulkan masalah tambahan, terutamanya bagi pelajar yang mempelajari Java pada Unix yang terbiasa dengan sistem penamaan fail DOS. Kelas MotorVehiclehendaklah disimpan dalam fail MotorVehicle.java, tetapi bukan dalam fail motorvehicle.java.

2. Perbandingan menggunakan==

Di Jawa, rentetan ialah objek kelas java.lang.String. Operator ==yang digunakan untuk memeriksa objek untuk kesamaan rujukan kepada objek! Kadangkala pelajar tidak memahami semantik pengendali ==dan cuba menggunakannya untuk membandingkan rentetan. Contoh yang salah:
// проверим, equals ли первый аргумент "-a"
if (args[0] == "-a") {
    optionsAll = true;
}
Cara yang betul untuk membandingkan 2 rentetan untuk kesamaan ialah menggunakan kaedah equals()kelas java.lang.String. Ia kembali truejika rentetan adalah sama panjang dan mengandungi aksara yang sama. (Nota: sebenarnya ini tidak menjamin kesaksamaan. Malah, equalsia menyemak sama ada 2 rentetan adalah aksara yang sama mengikut aksara) Contoh yang diperbetulkan:
//  проверим, equals ли первый аргумент "-a"
if ("-a".equals(args[0])) {
    optionsAll = true;
}
Ralat ini adalah bodoh, kerana sebenarnya kod Java ternyata betul secara sintaksis, tetapi pada akhirnya ia tidak berfungsi seperti yang diharapkan. Sesetengah pelajar juga cuba menggunakan operator perbandingan >dan bukannya <=kaedah compareTo()kelas java.lang.String. Ralat ini lebih mudah dikesan kerana ia menyebabkan ralat pada peringkat penyusunan.

3. Terlupa untuk memulakan objek yang merupakan elemen tatasusunan.

Di Jawa, tatasusunan objek sebenarnya adalah tatasusunan rujukan objek. Mencipta tatasusunan hanyalah mencipta satu set rujukan yang tidak menunjuk kepada apa-apa (iaitu, ia adalah batal). Untuk benar-benar mencipta tatasusunan "penuh" objek, anda perlu memulakan setiap elemen tatasusunan. Ramai pelajar tidak memahami perkara ini; mereka percaya bahawa dengan mencipta pelbagai objek, mereka secara automatik mencipta objek itu sendiri. (Dalam kebanyakan kes, pelajar membawa konsep ini daripada C++, di mana mencipta pelbagai objek menghasilkan objek itu sendiri dengan memanggil pembina lalai mereka.) Dalam contoh di bawah, pelajar ingin mencipta 3 objek kelas StringBuffer. Kod akan dikompil tanpa ralat, tetapi pengecualian akan berlaku dalam baris terakhir NullPointerException, di mana objek yang tidak wujud diakses. Contoh yang salah:
// Создаем массив из StringBuffer
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
myTempBuffers[0].add(data);
Untuk mengelakkan ralat ini, anda mesti ingat untuk memulakan elemen tatasusunan. Contoh yang diperbetulkan:
// Создаем массив из StringBuffer и инициализируем элементы
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
for (int ix = 0; ix < myTempBuffers.length; ix++)
     myTempBuffers[ix] = new StringBuffer();

myTempBuffers[0].add(data);

4. Meletakkan beberapa kelas dengan pengubah suai dalam satu fail sekaliguspublic

Fail sumber Java dikaitkan dengan cara tertentu dengan kelas yang terkandung dalam fail tersebut. Hubungan itu boleh dicirikan seperti berikut: Mana-mana kelas Java disimpan dalam tidak lebih daripada satu fail. Dalam mana-mana fail kod sumber anda boleh meletakkan tidak lebih daripada 1 kelas dengan pengubah suai public. Jika terdapat kelas dengan pengubah suai dalam fail kod sumber public, nama fail dan nama kelas mestilah sama (nota terjemahan: sehingga kes, lihat perkara 1) Kadangkala pelajar terlupa tentang peraturan ke-2, yang membawa kepada ralat pada kompilasi peringkat. Mesej ralat untuk peraturan ke-2 dan ke-3 adalah sama (iaitu yang sebenarnya menyukarkan untuk mengenali ralat ini).

5. Penggantian medan kelas dengan pembolehubah tempatan.

Java membolehkan anda mengisytiharkan pembolehubah dalam kaedah yang namanya sepadan dengan medan kelas. Dalam kes ini, pembolehubah tempatan akan diutamakan dan akan digunakan bukannya medan. Pengkompil akan membuang ralat jika pembolehubah dengan nama yang sama adalah jenis yang berbeza. Jika mereka adalah jenis yang sama, tidak akan ada ralat penyusunan, dan sebab untuk pengendalian program yang tidak betul akan menjadi tidak jelas. Contoh yang salah:
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;
    }
}
Terdapat beberapa cara untuk membetulkan ralat ini. Yang paling mudah ialah mengakses medan kelas menggunakan penunjuk tersirat this: this.Name_поля. Cara terbaik ialah menamakan semula medan kelas atau pembolehubah tempatan, maka penggantian tidak akan berlaku. (lebih kurang. Terjemahan: Kaedah ke-2 bukanlah kaedah kami. Selain itu, ia tidak menjamin bahawa saya tidak akan secara tidak sengaja menggantikan medan pembolehubah suatu hari nanti. Kesukaran yang lebih besar timbul dengan warisan, apabila saya tidak melihat sama sekali medan apa kelas telah ) Contoh yang diperbetulkan:
// 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;
  }
Satu lagi tempat yang mungkin untuk ralat ini berlaku ialah dengan menetapkan nama parameter kaedah agar sama dengan nama medan kelas. Ini kelihatan baik dalam pembina, tetapi tidak sesuai untuk kaedah biasa.

lebih kurang terjemahan

kelam kabut sikit, tapi itulah intinya

public class Test {
   private int param = 0;

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

iaitu, semuanya kelihatan cantik dalam pembina, tetapi ini tidak boleh digunakan untuk kaedah biasa.

6. Terlupa untuk memanggil pembina induk (superclass).

Apabila kelas memanjangkan kelas lain, setiap pembina subkelas mesti memanggil beberapa pembina superclass. Ini biasanya dicapai dengan memanggil pembina superclass dengan kaedah super(x)yang diletakkan pada baris pertama pembina. Jika tiada panggilan dalam baris pertama constructor super(x), pengkompil itu sendiri memasukkan panggilan ini, tetapi tanpa parameter: super(). (lebih kurang trans.: x...se, tetapi saya tidak tahu) Kadang-kadang pelajar terlupa tentang keperluan ini. Biasanya ini bukan masalah: panggilan kepada pembina superclass dimasukkan oleh pengkompil dan semuanya berfungsi dengan baik. Walau bagaimanapun, jika superclass tidak mempunyai pembina lalai, pengkompil akan membuang ralat. Dalam contoh di bawah, semua pembina kelas super java.io.Filemempunyai 1 atau 2 parameter: Contoh yang salah:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        classname = cl;
    }
}
Penyelesaian kepada masalah ini adalah dengan memasukkan panggilan eksplisit kepada pembina superclass yang betul: Contoh yang diperbetulkan:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        super(cl + ".class");
        classname = cl;
    }
}
Situasi yang lebih tidak menyenangkan berlaku apabila superclass mempunyai pembina lalai, tetapi ia tidak memulakan objek sepenuhnya. Dalam kes ini, kod akan disusun, tetapi output program mungkin tidak betul atau pengecualian mungkin berlaku.

7. Tersalah menangkap pengecualian

Sistem pengendalian pengecualian Java agak berkuasa, tetapi sukar difahami oleh pemula. Pelajar yang mahir dalam C++ atau Ada biasanya tidak mengalami kesukaran yang sama seperti pengaturcara C dan Fortran. Contoh di bawah menunjukkan beberapa kesilapan biasa. Dalam contoh ini, pengecualian tidak dinamakan. Pengkompil akan menunjukkan ralat ini pada peringkat penyusunan, jadi mudah untuk memperbaikinya sendiri. Contoh yang salah:
try {
    stream1 = new FileInputStream("data.txt");
} catch (IOException) {
    message("Could not open data.txt");
}
Contoh yang diperbetulkan:
try {
   stream1 = new FileInputStream("data.txt");
} catch (IOException ie) {
   message("Could not open data.txt: " + ie);
}
Susunan blok catchmenentukan susunan pengecualian yang ditangkap. Ia mesti diambil kira bahawa setiap blok tersebut akan menangkap semua pengecualian kelas yang ditentukan atau mana-mana subkelasnya. Jika anda tidak mengambil kira perkara ini, anda mungkin akan mendapat blok tangkapan yang tidak boleh dicapai, yang akan ditunjukkan oleh pengkompil. Dalam contoh di bawah SocketExceptionialah subkelas IOException. Contoh yang salah:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (IOException ie) {
    message("Error accepting connection.");
} catch (SocketException se) {
    message("Error setting time-out.");
}
Contoh yang diperbetulkan:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (SocketException se) {
    message("Error setting time-out.");
} catch (IOException ie) {
    message("Error accepting connection.");
}
Jika ada kemungkinan pengecualian berlaku dalam kod anda yang tidak ditangkap oleh mana-mana blok try-catch, maka pengecualian ini harus diisytiharkan dalam pengepala kaedah. RuntimeException( Ini tidak diperlukan untuk pengecualian - subkelas kelas ). Pelajar kadang-kadang lupa bahawa memanggil kaedah boleh membuang pengecualian. Cara paling mudah untuk membetulkannya ialah meletakkan panggilan kaedah dalam blok try-catch. Contoh yang salah:
public void waitFor(int sec) {
    Thread.sleep(sec * 1000);
}
Contoh yang diperbetulkan:
public void waitFor(int sec) throws InterruptedException {
    Thread.sleep(sec * 1000);
}

8. Kaedah capaian mempunyai jenisvoid

Ini adalah kesilapan yang sangat mudah. Pelajar mencipta kaedah untuk mengakses pembolehubah, tetapi menyatakan bahawa kaedah itu tidak mengembalikan apa-apa (meletakkan pengubah suai voiddalam pengepala kaedah). Untuk membetulkan ralat ini, anda mesti menentukan jenis pulangan yang betul. Contoh yang salah:
public class Line {
    private Point start, end;
    public void getStart() {
      return start;
    }
}
Contoh yang diperbetulkan:
public class Line {
    private Point start, end;
    public Point getStart() {
      return start;
    }
}
Menentukan jenis pulangan yang salah menjana keseluruhan kelas ralat. Biasanya pengkompil akan mengenali ralat ini dan melaporkannya supaya pelajar boleh membetulkannya sendiri. Pengarang: A. Grasoff™ Baca sambungan Pautan ke sumber: Kesilapan pengaturcara java pemula
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION