JavaRush /Java Blog /Random-TK /Başlangyç java programmistleriniň ýalňyşlyklary. 1-nji bö...
articles
Dereje

Başlangyç java programmistleriniň ýalňyşlyklary. 1-nji bölüm

Toparda çap edildi

1. Synpyň ady, saklanýan faýlyň adyndan tapawutlanýar

Ulanylan ähli java çarçuwalary, şol sanda Javasoft JDK-lary, köpçülikleýin üýtgediji bilen synpyň deslapky kody synpyň ady we .java giňeltmesi bilen birmeňzeş bir faýlda saklanýar diýip çaklaýarlar. Bu konwensiýany ýerine ýetirmezlik, düzülende ýüze çykjak köp problema döredip biler.
Başlangyç java programmistleriniň ýalňyşlyklary.  1-nji bölüm
Başlangyç talyplar (programmistler) köplenç bu konwensiýany ýatdan çykarýarlar we mysal üçin faýlyň adyny ýumuşa laýyklykda belläň: Lab6.java. Nädogry mysal: Faýlyň adyLab6.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
Dogry mysal: Faýlyň adyAirplane.java
public class Airplane extends Vehicle
  Seat pilot;
  public Airplane() {
    pilot = new Seat();
  }
}
Üns beriň:synpyň ady baş harp bilen başlar öýdülýär. Faýl atlarynda baş harp bilen işleýän operasiýa ulgamlary, esasanam DOS faýl atlandyryş ulgamyna öwrenişen Unix-da Java öwrenýän talyplar üçin goşmaça kynçylyklary döredip biler. Synp MotorVehiclebir faýlda saklanmalydyr MotorVehicle.java, ýöne a motorvehicle.java.

2. Ulanyşy deňeşdirmek==

Java-da setirler synpyň obýektleri java.lang.String. Operator ==obýektlere salgylanmalaryň deňligini barlamak üçin obýektlere ýüz tutdy! Käwagt talyplar operatoryň manysyna düşünmeýärler ==we setirleri deňeşdirmek üçin ulanmaga synanyşýarlar. Nädogry mysal:
// проверим, equals ли первый аргумент "-a"
if (args[0] == "-a") {
    optionsAll = true;
}
equals()Deňlik üçin 2 setiri deňeşdirmegiň dogry usuly synp usulyny ulanmakdyr java.lang.String. trueSetirler birmeňzeş uzynlykda we şol bir nyşanlary öz içine alýan bolsa gaýdyp gelýär . (Bellik: aslynda bu deňligi kepillendirmeýär. Aslynda equals2 setiriň häsiýet boýunça deňdigini ýa-da ýokdugyny barlaýar) Dogry mysal:
//  проверим, equals ли первый аргумент "-a"
if ("-a".equals(args[0])) {
    optionsAll = true;
}
Bu ýalňyşlyk samsyk, sebäbi aslynda Java kody sintaktik taýdan dogry bolup çykýar, ýöne ahyrynda garaşylşy ýaly işlemeýär. Käbir okuwçylar synp usulynyň ýerine deňeşdirme >we deňeşdirme operatorlaryny ulanmaga synanyşýarlar . Bu ýalňyşlygy tapmak has aňsat, sebäbi düzmek döwründe ýalňyşlyklara sebäp bolýar. <=compareTo()java.lang.String

3. Toplumyň elementleri bolan obýektleri başlamagy ýatdan çykardyňyz.

Java-da obýektleriň toplumy aslynda obýekt salgylanmalarynyň toplumydyr. Bir massiw döretmek, diňe bir zady görkezmeýän salgylanmalar toplumyny döretmekdir (ýagny, olar manysyz). Aslynda obýektleriň "doly" massiwini döretmek üçin, massiwiň her elementini başlamaly. Köp talyp muňa düşünmeýär; obýektleriň toplumyny döretmek bilen obýektleriň awtomatiki döredilýändigine ynanýarlar. (Köplenç ýagdaýda talyplar bu düşünjäni C ++ -dan getirýärler, bu ýerde köp sanly obýekt döretmek, deslapky konstruktoryna jaň edip obýektleriň döredilmegine getirýär.) Aşakdaky mysalda okuwçy synpyň 3 obýektini döretmek isleýär StringBuffer. NullPointerExceptionKod ýalňyşsyz jemlener, ýöne ýok bir obýektiň girip boljak iň soňky setirinde kadadan çykma bolar . Nädogry mysal:
// Создаем массив из StringBuffer
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
myTempBuffers[0].add(data);
Bu ýalňyşlygyň öňüni almak üçin, massiw elementlerini başlamagy ýatdan çykarmaly dälsiňiz. Dogry mysal:
// Создаем массив из StringBuffer и инициализируем элементы
StringBuffer [] myTempBuffers;
myTempBuffers = new StringBuffer[3];
for (int ix = 0; ix < myTempBuffers.length; ix++)
     myTempBuffers[ix] = new StringBuffer();

myTempBuffers[0].add(data);

4. Birbada bir faýlda üýtgediji bilen birnäçe synp goýmakpublic

Java çeşme faýllary belli bir derejede şol faýllardaky synplar bilen baglanyşyklydyr. Gatnaşyk aşakdaky ýaly häsiýetlendirilip bilner: Islendik Java synpy birden köp faýlda saklanýar. Islendik çeşme kody faýlynda üýtgediji bilen 1-den köp synp goýup bilmersiňiz public. Çeşme kody faýlynda üýtgediji bolan synp bar bolsa public, faýlyň ady we synpyň ady birmeňzeş bolmaly (terjime belligi: başda, 1-nji punkta serediň) Käwagt okuwçylar ýalňyşlyklara sebäp bolýan 2-nji düzgüni ýatdan çykarýarlar sahna düzülişinde. 2-nji we 3-nji düzgünler üçin säwlik habary birmeňzeş bolar (bu ýalňyşlygy tanamagy kynlaşdyrýan zat).

5. Synp meýdançasyny ýerli üýtgeýji bilen çalyşmak.

Java, ady synpyň meýdanlaryna gabat gelýän usulyň içinde üýtgeýjileri yglan etmäge mümkinçilik berýär. Bu ýagdaýda ýerli üýtgeýjiler ileri tutular we meýdanlaryň ýerine ulanylar. Birmeňzeş atlar bilen üýtgeýänler dürli görnüşli bolsa, düzüji ýalňyşlyk goýberer. Birmeňzeş görnüşler bolsa, düzme ýalňyşlygy bolmaz we programmanyň nädogry işlemeginiň sebäpleri belli bolmaz. Nädogry mysal:
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;
    }
}
Bu ýalňyşlygy düzetmegiň birnäçe usuly bar. Iň ýönekeýi, aç-açan görkeziji ulanyp synp meýdanlaryna girmek this: this.Name_поля. Iň oňat usul, synp meýdançasynyň ýa-da ýerli üýtgeýjiniň adyny üýtgetmek, şonda çalyşma bolmaz. . synp bar) Dogry mysal:
// 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;
  }
Bu ýalňyşlygyň ýüze çykmagy üçin başga bir ýer, usul parametriniň adyny synp meýdançasynyň ady bilen deňleşdirmekdir. Bu konstruktorlarda gowy görünýär, ýöne adaty usullar üçin amatly däl.

takmynan terjime

azajyk bulam-bujar, ýöne esasy zat

public class Test {
   private int param = 0;

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

ýagny konstruktorda hemme zat owadan görünýär, ýöne muny adaty usullar üçin ulanmaly däl.

6. Ene-atanyň (superklass) konstruktoryna jaň etmegi ýatdan çykardyňyz

Haçan-da bir synp başga bir synpy uzadanda, her kiçi konstruktor käbir superklass konstruktoryny çagyrmalydyr. super(x)Bu, adatça konstruktoryň birinji setirinde ýerleşdirilen usul bilen superklass konstruktoryny çagyrmak arkaly gazanylýar . Konstruktoryň birinji setirinde jaň ýok bolsa super(x), düzüjiniň özi bu jaňy goýýar, ýöne parametrleri bolmazdan : super(). (takmynan trans.: x ... se, ýöne bilmedim) Käwagt talyplar bu talaby ýatdan çykarýarlar. Adatça bu mesele däl: superklass konstruktoryna çagyryş düzüji tarapyndan girizilýär we hemme zat gowy işleýär. Şeýle-de bolsa, superklassyň deslapky konstruktory ýok bolsa, düzüji ýalňyşlyk goýberer. Aşakdaky mysalda, ähli superklass konstruktorlaryň java.io.File1 ýa-da 2 parametri bar: roralňyş mysal:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        classname = cl;
    }
}
Meseläniň çözgüdi dogry superklass konstruktoryna aç-açan jaň etmekdir: Düzedilen mysal:
public class JavaClassFile extends File {
    String classname;
    public JavaClassFile(String cl) {
        super(cl + ".class");
        classname = cl;
    }
}
Superklassyň deslapky konstruktory bar bolsa, has ýakymsyz ýagdaý ýüze çykýar, ýöne obýekti doly başlatmaýar. Bu ýagdaýda kod jemlener, ýöne programmanyň netijesi nädogry bolup biler ýa-da kadadan çykma bolup biler.

7. Kadadan çykmalar

Java-yň kadadan çykma ulgamy gaty güýçli, ýöne täze öwrenýänlere düşünmek kyn. C ++ ýa-da Ada-ny bilýän talyplar, adatça C we Fortran programmistleri ýaly kynçylyk çekmeýärler. Aşakdaky mysallar käbir umumy ýalňyşlyklary görkezýär. Bu mysalda kadadan çykma ady ýok. Düzediji bu ýalňyşlygy düzmek tapgyrynda görkezer, şonuň üçin ony özüňiz düzeltmek aňsat. Nädogry mysal:
try {
    stream1 = new FileInputStream("data.txt");
} catch (IOException) {
    message("Could not open data.txt");
}
Dogry mysal:
try {
   stream1 = new FileInputStream("data.txt");
} catch (IOException ie) {
   message("Could not open data.txt: " + ie);
}
Bloklaryň tertibi catchkadadan çykmalaryň tertibini kesgitleýär. Şeýle bloklaryň hersinde görkezilen synpdan ýa-da onuň kiçi toparlaryndan başga ähli kadadan çykmalar göz öňünde tutulmalydyr. Muny göz öňünde tutmasaňyz, düzüjiniň görkezjek ýetip bolmajak tutuş bloky bilen gutararsyňyz. Aşakdaky mysalda SocketExceptionkiçi klas bar IOException. Nädogry mysal:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (IOException ie) {
    message("Error accepting connection.");
} catch (SocketException se) {
    message("Error setting time-out.");
}
Dogry mysal:
try {
    serviceSocket.setSoTimeout(1000);
    newsock = serviceSocket.accept();
} catch (SocketException se) {
    message("Error setting time-out.");
} catch (IOException ie) {
    message("Error accepting connection.");
}
Kodyňyzda haýsydyr bir blok tutulmadyk kadadan çykma bolup bilýän bolsa try-catch, bu kadadan çykma usul sözbaşysynda yglan edilmelidir. RuntimeException( Bu kadadan çykmalar üçin zerur däl - synpyň kiçi klasslary ). Talyplar käwagt usuly çagyrmagyň kadadan çykma bolup biljekdigini ýatdan çykarýarlar. Muny düzetmegiň iň aňsat usuly, çagyryş usulyny blokda goýmakdyr try-catch. Nädogry mysal:
public void waitFor(int sec) {
    Thread.sleep(sec * 1000);
}
Dogry mysal:
public void waitFor(int sec) throws InterruptedException {
    Thread.sleep(sec * 1000);
}

8. Giriş usulynyň bir görnüşi barvoid

Bu gaty ýönekeý ýalňyşlyk. Talyp üýtgeýjä girmek üçin bir usul döredýär, ýöne usulyň hiç zady yzyna gaýtarmaýandygyny kesgitleýär ( voidusul sözbaşysyna üýtgediji goýýar). Bu ýalňyşlygy düzetmek üçin dogry gaýtarma görnüşini görkezmeli. Nädogry mysal:
public class Line {
    private Point start, end;
    public void getStart() {
      return start;
    }
}
Dogry mysal:
public class Line {
    private Point start, end;
    public Point getStart() {
      return start;
    }
}
Nädogry gaýdyp geliş görnüşini görkezmek, ýalňyşlyklaryň tutuş synpyny döredýär. Adatça düzüji bu ýalňyşlyklary tanar we okuwçylaryň özleri düzedip biler ýaly habar berer. Awtory: A. Grasoff ™ Dowamyny okaň Çeşmä baglanyşyk: Başlangyç java programmistleriniň ýalňyşlyklary
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION