JavaRush /Java блогу /Random-KY /Жаңы баштаган java программисттердин каталары. 1-бөлүк
articles
Деңгээл

Жаңы баштаган java программисттердин каталары. 1-бөлүк

Группада жарыяланган

1. Класстын аталышы ал сакталган файлдын атынан башкача

Мен колдонгон бардык java алHowтары, анын ичинде 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 тorн үйрөнүп жаткан студенттер үчүн кошумча көйгөйлөрдү жаратышы мүмкүн. Класс MotorVehicleфайлда сакталышы керек MotorVehicle.java, бирок файлда эмес motorvehicle.java.

2. Салыштыруу==

Java тorнде саптар класстын an objectилери болуп саналат java.lang.String. ==Объекттерге кайрылган оператор an objectтерге шилтемелердин теңдигин текшерет! Кээде окуучулар оператордун семантикасын түшүнбөй ==, саптарды салыштыруу үчүн колдонууга аракет кылышат. Туура эмес мисал:
// проверим, equals ли первый аргумент "-a"
if (args[0] == "-a") {
    optionsAll = true;
}
Теңдик үчүн 2 сапты салыштыруунун туура жолу equals()класс ыкмасын колдонуу болуп саналат java.lang.String. Ал trueсаптар бирдей узундукта жана бирдей символдорду камтыса, кайтарып берет. (Эскертүү: чындыгында бул теңчorкке кепилдик бербейт. Чынында, equalsал 2 саптын символ боюнча бирдей экендигин текшерет) Оңдолгон мисал:
//  проверим, equals ли первый аргумент "-a"
if ("-a".equals(args[0])) {
    optionsAll = true;
}
Бул ката акылсыздык, анткени чындыгында Java codeу синтаксистик жактан туура болуп чыгат, бирок аягында ал күтүлгөндөй иштебейт. Кээ бир студенттер класс ыкмасынын ордуна >жана салыштыруу операторлорун колдонууга аракет кылышат . Бул катаны аныктоо оңой, анткени ал компиляция баскычында каталарды жаратат. <=compareTo()java.lang.String

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

Java тorнде an objectтердин массиви чындыгында an objectке шилтемелердин массивинен турат. Массивди түзүү жөн гана эч нерсени көрсөтпөгөн шилтемелердин топтомун түзүү (башкача айтканда, алар нөл). Иш жүзүндө an objectтердин "толук" массивин түзүү үчүн массивдин ар бир элементин инициализациялоо керек. Көптөгөн студенттер муну түшүнүшпөйт; алар an objectтердин массивдерин түзүү менен, алар автоматтык түрдө an objectтерди өздөрү жаратат деп эсептешет. (Көпчүлүк учурларда, студенттер бул концепцияны C++ тorнен алып келишет, мында 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. Класс талаасын жергorктүү өзгөрмө менен алмаштыруу.

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_поля. Эң жакшы жолу класс талаасынын же жергorктүү өзгөрмөнүн атын өзгөртүү, анда алмаштыруу болбойт. (болжол менен котормосу: 2-ыкма биздин метод эмес. Анын үстүнө, мен качандыр бир өзгөрмөнүн талаасын кокустан алмаштырбайм деп кепилдик бере алbyte. Мурастоодо мындан да чоң кыйынчылык пайда болот, качан мен кайсы талааларды такыр көрбөсөм, класс бар ) Түзөтүлгөн мисал:
// 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ти толук инициализациялаbyte. Бул учурда, 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өзгөчө учурларды кармоонун тартибин аныктайт. Ар бир мындай блок көрсөтүлгөн класстын же анын кайсы бир подклассынын бардык өзгөчөлүктөрүн кармай турганын эске алуу керек. Эгерде сиз муну эске албасаңыз, анда сиз компилятор көрсөтүп турган жеткorксиз кармоо блогуна ээ болушуңуз мүмкүн. Төмөндөгү мисалда 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