JavaRush /Блоги Java /Random-TG /Хатогиҳои барномасозони ибтидоии java. Қисми 1
articles
Сатҳи

Хатогиҳои барномасозони ибтидоии java. Қисми 1

Дар гурӯҳ нашр шудааст

1. Номи синф аз номи файле, ки дар он захира шудааст, фарқ мекунад

Ҳама чаҳорчӯбаҳои java, ки ман истифода кардам, аз ҷумла Javasoft JDK, фарз мекунанд, ки рамзи сарчашмаи синф бо тағирдиҳандаи оммавӣ дар файл бо маҳз ҳамон ном бо номи синф ва васеъшавии .java нигоҳ дошта мешавад. Риоя накардани ин конвенсия метавонад мушкилоти зиёдеро ба бор орад, ки ҳангоми тартиб додан ба миён меоянд.
Хатогиҳои барномасозони ибтидоии 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();
  }
}
Илтимос не:номи синф бо ҳарфи калон оғоз мешавад. Системаҳои амалиётӣ, ки дар номҳои файл ба ҳарфи ҳарф ҳассос мебошанд, метавонанд мушкилоти иловагӣ эҷод кунанд, махсусан барои донишҷӯёне, ки Java-ро дар Unix меомӯзанд, ки ба системаи номгузории файлҳои DOS одат кардаанд. Синф MotorVehicleбояд дар файл нигоҳ дошта шавад MotorVehicle.java, аммо на дар файл motorvehicle.java.

2. Муқоиса бо истифода==

Дар Java сатрҳо an objectҳои синф мебошанд java.lang.String. Операторе ==, ки ба an objectҳо муроҷиат кардааст, баробарии истинодҳоро ба an objectҳо тафтиш мекунад! Баъзан хонандагон семантикаи операторро намефаҳманд ==ва кӯшиш мекунанд, ки сатрҳоро муқоиса кунанд. Намунаи нодуруст:
// проверим, 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;
}
Ин хато беақл аст, зеро дар асл рамзи Java аз ҷиҳати синтаксисӣ дуруст мебарояд, аммо дар ниҳоят он тавре ки интизор мерафт, кор намекунад. Баъзе донишҷӯён инчунин кӯшиш мекунанд, ки ба ҷои усули синф операторҳои >муқоисавиро истифода баранд . Муайян кардани ин хато осонтар аст, зеро он боиси хатогиҳо дар марҳилаи таҳия мегардад. <=compareTo()java.lang.String

3. Ба танзим даровардани an objectҳое, ки унсурҳои массив мебошанд, фаромӯш кардаед.

Дар Java, массиви an objectҳо воқеан массиви истинодҳои an objectҳост. Эҷоди массив ин танҳо сохтани маҷмӯи истинодҳо мебошад, ки ба ҳеҷ чиз ишора намекунанд (яъне онҳо нул мебошанд). Барои воқеан сохтани массиви "пурраи" an objectҳо, шумо бояд ҳар як элементи массивро оғоз кунед. Бисьёр студентон инро намефахманд; онҳо боварӣ доранд, ки бо сохтани массиви an objectҳо худашон an objectҳоро ба таври худкор эҷод мекунанд. (Дар аксари мавридҳо, донишҷӯён ин консепсияро аз C++ меоранд, ки дар он ҷо эҷоди массиви an objectҳо боиси эҷоди худи an objectҳо тавассути даъват кардани конструктори пешфарз мегардад.) Дар мисоли зер донишҷӯ мехоҳад 3 an objectи синфро созад StringBuffer. Рамз бидуни хато тартиб дода мешавад, аммо дар сатри охирин NullPointerException, ки дар он an objectи мавҷуда дастрас нест, истисно рӯй медиҳад. Намунаи нодуруст:
// Создаем массив из 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

Файлҳои сарчашмаи Java бо роҳҳои муайян бо синфҳои дар ин файлҳо мавҷудбуда алоқаманданд. Муносибатро ба таври зерин тавсиф кардан мумкин аст: Ҳар як синфи Java дар на бештар аз як файл нигоҳ дошта мешавад. Дар ҳама гуна файли codeи сарчашма шумо метавонед на бештар аз 1 синфро бо тағирдиҳанда ҷойгир кунед public. Агар дар файли codeи ибтидоӣ синф бо тағирдиҳанда мавҷуд бошад public, номи файл ва номи синф бояд комилан якхела бошанд (эзоҳи тарҷума: то ба маврид, ба банди 1 нигаред) Баъзан донишҷӯён қоидаи 2-ро фаромӯш мекунанд, ки ин боиси хатогиҳо мегардад. дар марҳилаи таҳия. Паёми хатогӣ барои қоидаҳои 2 ва 3 якхела хоҳад буд (ки воқеан эътироф кардани ин хаторо мушкил мекунад).

5. Иваз кардани майдони синф бо тағирёбандаи маҳаллӣ.

Java ба шумо имкон медиҳад, ки тағирёбандаҳоро дар дохor усул эълон кунед, ки номашон ба майдонҳои синф мувофиқат мекунад. Дар ин ҳолат, тағирёбандаҳои маҳаллӣ афзалият доранд ва ба ҷои майдонҳо истифода мешаванд. Компилятор хато мекунад, агар тағирёбандаҳо бо як ном навъҳои гуногун бошанд. Агар онҳо як навъ бошанд, ҳеҷ гуна хатогии тартибдиҳӣ вуҷуд нахоҳад дошт ва сабабҳои кори нодурусти барнома норавшан хоҳад буд. Намунаи нодуруст:
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;
    }
}
Якчанд роҳҳо барои ислоҳи ин хато вуҷуд доранд. Оддатаринаш дастрас шудан ба майдонҳои синф бо истифода аз нишоннамои номуайян аст this: this.Name_поля. Роҳи беҳтарин ин иваз кардани номи майдони синф ё тағирёбандаи маҳаллӣ аст, пас ивазкунӣ рӯй намедиҳад. (тақрибан. Тарҷума: Усули 2 усули мо нест. Гузашта аз ин, он кафолат намедиҳад, ки ман ягон майдони тағирёбандаро тасодуфан иваз намекунам. Бо мерос мушкorи бештаре ба миён меояд, вақте ки ман умуман кадом соҳаҳоро намебинам. синф дорад ) Намунаи ислоҳшуда:
// 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.File1 ё 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;
    }
}
Вазъияти ногувортаре рух медиҳад, ки суперкласс дорои конструктори пешфарз аст, аммо он an objectро пурра оғоз намекунад. Дар ин ҳолат, code тартиб дода мешавад, аммо баромади барнома метавонад нодуруст бошад ё истисно рӯй диҳад.

7. Истисноҳоро нодуруст гирифтан

Системаи коркарди истисноии Java хеле пурқувват аст, аммо фаҳмидани он барои шурӯъкунандагон душвор аст. Донишҷӯёне, ки забонҳои 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.");
}
Агар имкон дошта бошад, ки дар codeи шумо истисно ба амал ояд, ки онро ягон блок дастгир накардааст 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™ Давомро хонед Истинод ба манбаъ: Хатогиҳои барномасозони ибтидоии java
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION