JavaRush /Java Blog /Random-ID /Kesalahan programmer java pemula. Bagian 1
articles
Level 15

Kesalahan programmer java pemula. Bagian 1

Dipublikasikan di grup Random-ID

1. Nama kelas berbeda dengan nama file tempat penyimpanannya

Semua kerangka kerja java yang saya gunakan, termasuk Javasoft JDK, berasumsi bahwa kode sumber untuk kelas dengan pengubah publik disimpan dalam file dengan nama yang persis sama dengan nama kelas dan ekstensi .java. Kegagalan untuk mengikuti konvensi ini dapat menyebabkan banyak masalah yang akan muncul selama kompilasi.
Kesalahan programmer java pemula.  Bagian 1 - 1
Pelajar pemula (programmer) sering melupakan konvensi ini dan misalnya mengatur nama file sesuai dengan tugasnya: Lab6.java. Contoh yang salah: Nama fileLab6.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
Contoh yang diperbaiki: Nama fileAirplane.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
Tolong dicatat:nama kelas diasumsikan diawali dengan huruf kapital. Sistem operasi yang peka huruf besar-kecil dalam nama file dapat menimbulkan masalah tambahan, terutama bagi siswa yang mempelajari Java di Unix yang terbiasa dengan sistem penamaan file DOS. Kelas MotorVehicleharus disimpan dalam file MotorVehicle.java, bukan dalam file motorvehicle.java.

2. Perbandingan menggunakan==

Di Java, string adalah objek kelas java.lang.String. Operator ==yang diterapkan pada objek memeriksa kesetaraan referensi ke objek! Terkadang siswa tidak memahami semantik operator ==dan mencoba menggunakannya untuk membandingkan string. Contoh yang salah:
// проверим, equals ли первый аргумент "-a"
if (args[0] == "-a") {
    optionsAll = true;
}
Cara yang benar untuk membandingkan 2 string untuk kesetaraan adalah dengan menggunakan metode equals()kelas java.lang.String. Ia kembali truejika string memiliki panjang yang sama dan berisi karakter yang sama. (Catatan: sebenarnya ini tidak menjamin kesetaraan. Faktanya, equalsini memeriksa apakah 2 string memiliki karakter yang sama) Contoh yang diperbaiki:
//  проверим, equals ли первый аргумент "-a"
if ("-a".equals(args[0])) {
    optionsAll = true;
}
Kesalahan ini bodoh, karena sebenarnya kode Java secara sintaksis benar, tetapi pada akhirnya tidak berfungsi seperti yang diharapkan. Beberapa siswa juga mencoba menggunakan operator perbandingan >dan sebagai pengganti <=metode compareTo()kelas java.lang.String. Kesalahan ini lebih mudah dideteksi karena menyebabkan kesalahan pada tahap kompilasi.

3. Lupa menginisialisasi objek yang merupakan elemen array.

Di Java, array objek sebenarnya adalah array referensi objek. Membuat array hanyalah membuat sekumpulan referensi yang tidak menunjuk ke apa pun (yaitu null). Untuk benar-benar membuat array objek "penuh", Anda perlu menginisialisasi setiap elemen array. Banyak siswa yang tidak memahami hal ini; mereka percaya bahwa dengan membuat array objek, mereka secara otomatis membuat objek itu sendiri. (Dalam kebanyakan kasus, siswa membawa konsep ini dari C++, di mana pembuatan array objek menghasilkan pembuatan objek itu sendiri dengan memanggil konstruktor defaultnya.) Pada contoh di bawah ini, siswa ingin membuat 3 objek kelas StringBuffer. Kode akan dikompilasi tanpa kesalahan, tetapi pengecualian akan terjadi di baris terakhir NullPointerException, di mana objek yang tidak ada diakses. Contoh yang salah:
// Создаем массив из StringBuffer
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
myTempBuffers[0].add(data);
Untuk menghindari kesalahan ini, Anda harus ingat untuk menginisialisasi elemen array. Contoh yang diperbaiki:
// Создаем массив из StringBuffer и инициализируем элементы
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
for (int ix = 0; ix < myTempBuffers.length; ix++)
     myTempBuffers[ix] = new StringBuffer();

myTempBuffers[0].add(data);

4. Menempatkan beberapa kelas dengan modifier dalam satu file sekaliguspublic

File sumber Java dikaitkan dengan cara tertentu dengan kelas yang terdapat dalam file tersebut. Hubungannya dapat dicirikan sebagai berikut: Setiap kelas Java disimpan tidak lebih dari satu file. Dalam file kode sumber apa pun Anda dapat menempatkan tidak lebih dari 1 kelas dengan pengubah public. Jika ada kelas dengan pengubah di file kode sumber public, nama file dan nama kelas harus benar-benar sama (catatan terjemahan: untuk kasus ini, lihat poin 1) Terkadang siswa melupakan aturan ke-2, yang menyebabkan kesalahan pada tahap kompilasi. Pesan kesalahan untuk aturan ke-2 dan ke-3 akan sama (yang sebenarnya membuat kesalahan ini sulit dikenali).

5. Substitusi field kelas dengan variabel lokal.

Java memungkinkan Anda mendeklarasikan variabel di dalam metode yang namanya cocok dengan bidang kelas. Dalam hal ini, variabel lokal akan diutamakan dan akan digunakan sebagai pengganti kolom. Kompiler akan memunculkan kesalahan jika variabel dengan nama yang sama memiliki tipe yang berbeda. Jika tipenya sama, tidak akan ada kesalahan kompilasi, dan alasan pengoperasian program yang salah tidak akan 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;
    }
}
Ada beberapa cara untuk memperbaiki kesalahan ini. Cara paling sederhana adalah mengakses field kelas menggunakan pointer implisit this: this.Name_поля. Cara terbaik adalah dengan mengganti nama field kelas atau variabel lokal, maka substitusi tidak akan terjadi. (kira-kira Terjemahan: Metode ke-2 bukanlah metode kami. Selain itu, ini tidak menjamin bahwa saya tidak akan secara tidak sengaja mengganti bidang suatu variabel suatu hari nanti. Kesulitan yang lebih besar muncul dengan warisan, ketika saya tidak melihat sama sekali bidang apa kelas memiliki ) Contoh yang diperbaiki:
// 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;
  }
Tempat lain yang memungkinkan terjadinya kesalahan ini adalah dengan mengatur nama parameter metode agar sama dengan nama bidang kelas. Ini terlihat bagus di konstruktor, tetapi tidak cocok untuk metode normal.

kira-kira. terjemahan

sedikit kacau, tapi itulah intinya

public class Test {
   private int param = 0;

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

artinya, semuanya tampak indah di konstruktor, tetapi ini tidak boleh digunakan untuk metode biasa.

6. Lupa memanggil konstruktor induk (superclass).

Ketika suatu kelas memperluas kelas lain, setiap konstruktor subkelas harus memanggil beberapa konstruktor superkelas. Hal ini biasanya dicapai dengan memanggil konstruktor superclass dengan metode super(x)yang ditempatkan pada baris pertama konstruktor. Jika tidak ada panggilan di baris pertama konstruktor super(x), kompiler akan memasukkan panggilan ini sendiri, tetapi tanpa parameter: super(). (kira-kira trans.: x...se, tapi saya tidak tahu) Terkadang siswa melupakan persyaratan ini. Biasanya ini bukan masalah: panggilan ke konstruktor superclass dimasukkan oleh kompiler dan semuanya berfungsi dengan baik. Namun, jika superclass tidak memiliki konstruktor default, compiler akan menampilkan error. Pada contoh di bawah, semua konstruktor superclass java.io.Filemempunyai 1 atau 2 parameter: Contoh yang salah:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        classname = cl;
    }
}
Solusi untuk masalah ini adalah dengan memasukkan panggilan eksplisit ke konstruktor superclass yang benar: Contoh yang diperbaiki:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        super(cl + ".class");
        classname = cl;
    }
}
Situasi yang lebih tidak menyenangkan terjadi ketika superclass memiliki konstruktor default, namun tidak sepenuhnya menginisialisasi objek. Dalam hal ini, kode akan dikompilasi, namun keluaran program mungkin salah atau pengecualian mungkin terjadi.

7. Salah menangkap pengecualian

Sistem penanganan pengecualian Java cukup kuat, tetapi sulit dipahami oleh pemula. Siswa yang mahir C++ atau Ada biasanya tidak mengalami kesulitan seperti programmer C dan Fortran. Contoh di bawah menunjukkan beberapa kesalahan umum. Dalam contoh ini, pengecualian tidak disebutkan namanya. Kompiler akan menunjukkan kesalahan ini pada tahap kompilasi, sehingga mudah untuk memperbaikinya sendiri. Contoh yang salah:
try {
    stream1 = new FileInputStream("data.txt");
} catch (IOException) {
    message("Could not open data.txt");
}
Contoh yang diperbaiki:
try {
   stream1 = new FileInputStream("data.txt");
} catch (IOException ie) {
   message("Could not open data.txt: " + ie);
}
Urutan blok catchmenentukan urutan penangkapan pengecualian. Harus diingat bahwa setiap blok tersebut akan menangkap semua pengecualian dari kelas tertentu atau subkelasnya. Jika Anda tidak memperhitungkan hal ini, Anda mungkin mendapatkan blok tangkapan yang tidak dapat dijangkau, yang akan ditunjukkan oleh kompiler. Pada contoh di bawah ini SocketExceptionadalah subkelas dari 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 diperbaiki:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (SocketException se) {
    message("Error setting time-out.");
} catch (IOException ie) {
    message("Error accepting connection.");
}
Jika pengecualian dapat terjadi pada kode Anda yang tidak ditangkap oleh blok mana pun try-catch, maka pengecualian ini harus dideklarasikan di header metode. RuntimeException( Ini tidak diperlukan untuk pengecualian - subkelas dari suatu kelas ). Siswa terkadang lupa bahwa memanggil suatu metode dapat menimbulkan pengecualian. Cara termudah untuk memperbaikinya adalah dengan memasukkan pemanggilan metode ke dalam blok try-catch. Contoh yang salah:
public void waitFor(int sec) {
    Thread.sleep(sec * 1000);
}
Contoh yang diperbaiki:
public void waitFor(int sec) throws InterruptedException {
    Thread.sleep(sec * 1000);
}

8. Metode akses memiliki tipevoid

Ini adalah kesalahan yang sangat sederhana. Siswa membuat metode untuk mengakses variabel, tetapi menentukan bahwa metode tersebut tidak mengembalikan apa pun (menempatkan pengubah voiddi header metode). Untuk memperbaiki kesalahan ini, Anda harus menentukan jenis pengembalian yang benar. Contoh yang salah:
public class Line {
    private Point start, end;
    public void getStart() {
      return start;
    }
}
Contoh yang diperbaiki:
public class Line {
    private Point start, end;
    public Point getStart() {
      return start;
    }
}
Menentukan tipe pengembalian yang salah akan menghasilkan seluruh kelas kesalahan. Biasanya penyusun akan mengenali kesalahan ini dan melaporkannya sehingga siswa dapat memperbaikinya sendiri. Penulis: A. Grasoff™ Baca lanjutannya Tautan ke sumber: Kesalahan programmer java pemula
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION