JavaRush /Java блогы /Random-KK /Жаңадан бастаған java бағдарламашыларының қателері. 1 бөл...
articles
Деңгей

Жаңадан бастаған java бағдарламашыларының қателері. 1 бөлім

Топта жарияланған

1. Класс аты ол сақталатын файлдың атынан ерекшеленеді

Мен пайдаланған барлық java фреймворктері, соның ішінде Javasoft JDK, жалпы модификаторы бар сыныптың бастапқы codeы сынып атауымен және .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();
  }
}
Ескерту:сынып атауы бас әріптен басталады деп есептеледі. Файл атауларында регистрді ескеретін операциялық жүйелер, әсіресе DOS файлды атау жүйесіне үйренген Unix жүйесінде Java тілін үйренетін студенттер үшін қосымша проблемаларды тудыруы мүмкін. Сынып MotorVehicleфайлда сақталуы керек MotorVehicle.java, бірақ файлда емес motorvehicle.java.

2. Қолдану арқылы салыстыру==

Java тілінде жолдар сыныптың an objectілері болып табылады java.lang.String. ==Объектілерге қолданылған оператор 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 codeы синтаксистік тұрғыдан дұрыс болып шығады, бірақ соңында ол күткендей жұмыс істемейді. Кейбір оқушылар сынып әдісінің орнына >және салыстыру операторларын қолдануға тырысады . Бұл қатені анықтау оңай, себебі ол компиляция кезеңінде қателерді тудырады. <=compareTo()java.lang.String

3. Массив элементтері болып табылатын нысандарды инициализациялауды ұмыттыңыз.

Java тілінде нысандар массиві шын мәнінде нысан сілтемелерінің массиві болып табылады. Массив жасау - бұл жай ғана ештеңені көрсетпейтін сілтемелер жинағын жасау (яғни, олар нөл). Нысандардың «толық» массивін іс жүзінде жасау үшін массивтің әрбір элементін инициализациялау қажет. Көптеген студенттер мұны түсінбейді; олар an objectілер массивін жасау арқылы автоматты түрде an objectілерді өздері жасайды деп есептейді. (Көп жағдайда студенттер бұл тұжырымдаманы C++ тілінен әкеледі, мұнда нысандар жиымын жасау олардың әдепкі конструкторын шақыру арқылы нысандардың өздерін жасауға әкеледі.) Төмендегі мысалда оқушы сыныптың 3 нысанын жасағысы келеді StringBuffer. Код қатесіз құрастырылады, бірақ NullPointerExceptionжоқ нысанға қатынасатын соңғы жолда ерекше жағдай орын алады. Қате мысал:
// Создаем массив из 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 атауы класс өрістеріне сәйкес келетін әдіс ішінде айнымалы мәндерді жариялауға мүмкіндік береді. Бұл жағдайда жергілікті айнымалылар басымдыққа ие болады және өрістердің орнына пайдаланылады. Бірдей атаулары бар айнымалылар әртүрлі типте болса, компилятор қате жібереді. Егер олардың түрлері бірдей болса, компиляция қатесі болмайды және бағдарламаның дұрыс жұмыс істемеу себептері түсініксіз болады. Қате мысал:
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-ші әдіс біздің әдіс емес. Оның үстіне, ол мен бір күні айнымалы өрісті кездейсоқ ауыстырмайтыныма кепілдік бермейді. Тұқым қуалау кезінде мен қандай өрістерді мүлдем көрмесем, одан да үлкен қиындық туындайды. сыныпта ) Түзетілген мысал:
// 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;
    }
}
Неғұрлым жағымсыз жағдай суперкласста әдепкі конструктор болған кезде орын алады, бірақ ол нысанды толығымен инициализацияламайды. Бұл жағдайда 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;
    }
}
Қате қайтару түрін көрсету қателердің бүкіл класын жасайды. Әдетте компилятор бұл қателерді таниды және студенттер оларды өздері түзете алатындай етіп хабарлайды. Authorы: A. Grasoff™ Жалғасын оқу Дереккөзге сілтеме: Жаңадан бастаған java бағдарламашыларының қателері
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION