JavaRush /Blog Jawa /Random-JV /Kesalahan programer java pemula. Bagean 1
articles
tingkat

Kesalahan programer java pemula. Bagean 1

Diterbitake ing grup

1. Jeneng kelas beda karo jeneng file sing disimpen

Kabeh frameworks java aku wis digunakake, kalebu Javasoft JDKs, nganggep yen kode sumber kanggo kelas karo modifier umum disimpen ing file karo jeneng sing padha karo jeneng kelas lan extension .java. Gagal ngetutake konvensi iki bisa nyebabake akeh masalah sing bakal katon sajrone kompilasi.
Kesalahan programer java pemula.  Bagean 1 - 1
Siswa wiwitan (programer) asring lali babagan konvensi iki lan, contone, nyetel jeneng file sesuai karo tugas: Lab6.java. Conto sing salah: Jeneng berkasLab6.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
Tuladha sing didandani: Jeneng berkasAirplane.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
Tulung dicathet:jeneng kelas dianggep diwiwiti karo huruf kapital. Sistem operasi sing sensitif huruf cilik ing jeneng file bisa nyebabake masalah tambahan, utamane kanggo siswa sing sinau basa Jawa ing Unix sing wis biasa karo sistem penamaan file DOS. Kelas MotorVehiclekudu disimpen ing file MotorVehicle.java, nanging ora ing file motorvehicle.java.

2. Comparison nggunakake==

Ing Jawa, strings minangka obyek saka kelas java.lang.String. Operator ==sing ditrapake kanggo obyek mriksa kesetaraan referensi kanggo obyek! Kadhangkala siswa ora ngerti semantik operator ==lan nyoba nggunakake kanggo mbandhingake strings. Tuladha sing salah:
// проверим, equals ли первый аргумент "-a"
if (args[0] == "-a") {
    optionsAll = true;
}
Cara sing bener kanggo mbandhingake 2 senar kanggo kesetaraan yaiku nggunakake metode equals()kelas java.lang.String. Ngasilake trueyen senar padha dawa lan ngemot karakter sing padha. (Wigati: bener iki ora njamin kesetaraan. Nyatane, equalsmriksa apa 2 strings padha karakter dening karakter) Conto didandani:
//  проверим, equals ли первый аргумент "-a"
if ("-a".equals(args[0])) {
    optionsAll = true;
}
Kesalahan iki bodho, amarga nyatane kode Jawa dadi bener sintaksis, nanging pungkasane ora bisa kaya sing dikarepake. Sawetara siswa uga nyoba nggunakake operator >lan perbandingan tinimbang <=metode compareTo()kelas java.lang.String. Kesalahan iki luwih gampang dideteksi amarga nyebabake kesalahan sajrone tahap kompilasi.

3. Kelalen kanggo initialize obyek sing unsur Uploaded.

Ing Jawa, array saka obyek bener array saka referensi obyek. Nggawe array mung nggawe sakumpulan referensi sing ora nuduhake apa-apa (yaiku null). Kanggo bener nggawe array "lengkap", sampeyan kudu miwiti saben unsur saka array. Akeh siswa sing ora ngerti iki; dheweke percaya yen kanthi nggawe macem-macem obyek, dheweke nggawe obyek kasebut kanthi otomatis. (Ing umume kasus, siswa nggawa konsep iki saka C ++, ing ngendi nggawe macem-macem obyek bisa nggawe obyek kasebut dhewe kanthi nelpon konstruktor standar.) Ing conto ing ngisor iki, siswa pengin nggawe 3 obyek kelas StringBuffer. Kode bakal kompilasi tanpa kasalahan, nanging pangecualian bakal kelakon ing baris pungkasan NullPointerException, ngendi obyek non-ana diakses. Tuladha sing salah:
// Создаем массив из StringBuffer
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
myTempBuffers[0].add(data);
Kanggo ngindhari kesalahan iki, sampeyan kudu ngelingi wiwitan unsur array. Tuladha sing dibenerake:
// Создаем массив из StringBuffer и инициализируем элементы
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
for (int ix = 0; ix < myTempBuffers.length; ix++)
     myTempBuffers[ix] = new StringBuffer();

myTempBuffers[0].add(data);

4. Nyelehake sawetara kelas kanthi modifier ing siji file bebarenganpublic

File sumber Jawa digandhengake kanthi cara tartamtu karo kelas sing ana ing file kasebut. Hubungane bisa ditondoi kaya ing ngisor iki: Sembarang kelas Java disimpen ing ora luwih saka siji file. Ing sembarang file kode sumber sampeyan bisa manggonake ora luwih saka 1 kelas karo modifier public. Yen ana kelas kanthi modifier ing file kode sumber public, jeneng file lan jeneng kelas kudu padha (cathetan terjemahan: nganti cilik, deleng titik 1) Kadhangkala siswa lali babagan aturan 2, sing nyebabake kesalahan. ing tataran kompilasi. Pesen kesalahan kanggo aturan 2 lan 3 bakal padha (sing bener nggawe angel kanggo ngenali kesalahan iki).

5. Substitusi lapangan kelas karo variabel lokal.

Jawa ngidini sampeyan ngumumake variabel ing metode sing jenenge cocog karo kolom kelas. Ing kasus iki, variabel lokal bakal diutamakake lan bakal digunakake tinimbang kolom. Compiler bakal nggawe kesalahan yen variabel kanthi jeneng sing padha beda-beda. Yen jinis sing padha, ora bakal ana kesalahan kompilasi, lan alasan kanggo operasi program sing ora bener bakal ora jelas. Tuladha sing 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;
    }
}
Ana sawetara cara kanggo ndandani kesalahan iki. Sing paling gampang yaiku ngakses kolom kelas nggunakake pointer implisit this: this.Name_поля. Cara sing paling apik yaiku ngganti jeneng kolom kelas utawa variabel lokal, mula substitusi ora bakal kedadeyan. (approx. Transl.: Cara 2nd ora cara kita. Kajaba iku, iku ora njamin yen aku ora sengaja ngganti lapangan saka variabel liyawektu. Ana kangelan malah luwih gedhe karo warisan, nalika aku ora weruh ing kabeh lapangan apa. kelas wis ) conto sing didandani:
// 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;
  }
Panggonan liya kanggo kesalahan iki yaiku kanthi nyetel jeneng parameter metode supaya padha karo jeneng lapangan kelas. Iki katon apik ing konstruktor, nanging ora cocok kanggo cara normal.

kira-kira. ngartekne

rada semrawut, nanging sing inti

public class Test {
   private int param = 0;

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

iku, kabeh katon ayu ing konstruktor, nanging iki ngirim ora digunakake kanggo cara biasa.

6. Kelalen nelpon tiyang sepah (superclass) konstruktor

Nalika kelas ngluwihi kelas liyane, saben konstruktor subclass kudu nelpon sawetara konstruktor superclass. Iki biasane digayuh kanthi nelpon konstruktor superclass kanthi metode super(x)sing diselehake ing baris pisanan konstruktor. Yen ora ana telpon ing baris pisanan konstruktor super(x), compiler dhewe masang telpon iki, nanging tanpa paramèter super():. (approx. trans.: x...se, nanging aku ora ngerti) Kadhangkala siswa lali babagan syarat iki. Biasane iki ora masalah: telpon kanggo konstruktor superclass dilebokake dening compiler lan kabeh dianggo nggoleki. Nanging, yen superclass ora duwe konstruktor standar, compiler bakal uncalan kesalahan. Ing conto ing ngisor iki, kabeh konstruktor superclass java.io.Fileduwe 1 utawa 2 paramèter: Conto sing salah:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        classname = cl;
    }
}
Solusi kanggo masalah kasebut yaiku masang panggilan eksplisit menyang konstruktor superclass sing bener: Conto sing didandani:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        super(cl + ".class");
        classname = cl;
    }
}
Kahanan sing luwih ora nyenengake nalika superclass duwe konstruktor standar, nanging ora bisa miwiti obyek kanthi lengkap. Ing kasus iki, kode bakal dikompilasi, nanging output program bisa uga salah utawa ana pangecualian.

7. Salah nyekel pangecualian

Sistem penanganan istiméwa Jawa cukup kuat, nanging angel kanggo pamula ngerti. Siswa sing pinter C ++ utawa Ada biasane ora duwe kesulitan sing padha karo programer C lan Fortran. Conto ing ngisor iki nuduhake sawetara kesalahan umum. Ing conto iki, pangecualian ora dijenengi. Compiler bakal nuduhake kesalahan iki ing tataran kompilasi, supaya gampang kanggo ndandani dhewe. Tuladha sing salah:
try {
    stream1 = new FileInputStream("data.txt");
} catch (IOException) {
    message("Could not open data.txt");
}
Tuladha sing dibenerake:
try {
   stream1 = new FileInputStream("data.txt");
} catch (IOException ie) {
   message("Could not open data.txt: " + ie);
}
Urutan pamblokiran catchnemtokake urutan pangecualian sing kejiret. Sampeyan kudu eling yen saben blok kasebut bakal nyekel kabeh pangecualian saka kelas sing ditemtokake utawa subclasse. Yen sampeyan ora njupuk iki menyang akun, sampeyan bisa mungkasi karo pemblokiran nyekel unreachable, kang compiler bakal nuduhake metu. Ing conto ing ngisor iki SocketExceptionminangka subclass saka IOException. Tuladha sing salah:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (IOException ie) {
    message("Error accepting connection.");
} catch (SocketException se) {
    message("Error setting time-out.");
}
Tuladha sing dibenerake:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (SocketException se) {
    message("Error setting time-out.");
} catch (IOException ie) {
    message("Error accepting connection.");
}
Yen bisa ana pangecualian ing kode sampeyan sing ora kejiret dening blok apa wae try-catch, mula pangecualian iki kudu diumumake ing header metode. RuntimeException( Iki ora perlu kanggo pangecualian - subclasses saka kelas ). Siswa kadang lali yen nelpon metode bisa mbuwang pengecualian. Cara paling gampang kanggo ndandani iki yaiku nglebokake panggilan metode ing blok try-catch. Tuladha sing salah:
public void waitFor(int sec) {
    Thread.sleep(sec * 1000);
}
Tuladha sing dibenerake:
public void waitFor(int sec) throws InterruptedException {
    Thread.sleep(sec * 1000);
}

8. Cara akses nduweni jinisvoid

Iki kesalahan banget prasaja. Siswa nggawe cara kanggo ngakses variabel, nanging nemtokake manawa metode kasebut ora ngasilake apa-apa (nyelehake modifier voiding header metode). Kanggo ndandani kesalahan iki, sampeyan kudu nemtokake jinis bali sing bener. Tuladha sing salah:
public class Line {
    private Point start, end;
    public void getStart() {
      return start;
    }
}
Tuladha sing dibenerake:
public class Line {
    private Point start, end;
    public Point getStart() {
      return start;
    }
}
Nemtokake jinis bali salah ngasilake kabeh kelas kasalahan. Biasane compiler bakal ngenali kesalahan kasebut lan nglaporake supaya siswa bisa mbenerake dhewe. Pengarang: A. Grasoff™ Waca tutugan Link menyang sumber: Kesalahan programmer java pemula
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION