JavaRush /Java блогу /Random-KY /Өзгөчө учурлар: текшерилген, белгиленбеген жана өзүңүздүн...

Өзгөчө учурлар: текшерилген, белгиленбеген жана өзүңүздүн

Группада жарыяланган
Салам! Акыркы лекцияда биз Java тorнин өзгөчө учурлары менен таанышып, алар менен иштөөнүн мисалдарын көрдүк. Бүгүн биз алардын түзүмүн тереңирээк карап чыгабыз, ошондой эле өзүбүздүн өзгөчөлүктөрүбүздү кантип жазууну үйрөнөбүз :)

Өзгөчөлүктөрдүн түрлөрү

Биз айткандай, Javaда өзгөчө класстар көп, дээрлик 400! Бирок алардын баары топторго бөлүнгөн, ошондуктан аларды эстеп калуу оңой. Бул төмөнкүдөй көрүнөт: Өзгөчө учурлар: текшерилген, белгиленбеген жана өзүңүздүн - 2Бардык өзгөчөлүктөр жалпы ата-теги класска ээ Throwable. Андан эки чоң топ чыгат - өзгөчө учурлар (Exception) жана каталар (Ката). Ката Java виртуалдык машинасынын иштеши менен байланышкан программаны аткаруу учурундагы олуттуу ката. Көпчүлүк учурларда, катаны чечүүнүн кереги жок, анткени ал codeдогу олуттуу кемчorктерди көрсөтүп турат. Эң белгилүү каталар: StackOverflowError- мисалы, метод өзүн чексиз чакырганда пайда болот жана OutOfMemoryError- жаңы an objectтерди түзүү үчүн эстутум жетишсиз болгондо пайда болот. Көрүнүп тургандай, мындай учурларда, көбүнчө иштетүү үчүн өзгөчө эч нерсе жок - code жөн гана туура эмес жазылган жана кайра жасоо керек. Өзгөчө жагдайлар , чындыгында, өзгөчө учурлар: программа иштеп жатканда пайда болгон өзгөчө, пландаштырылбаган жагдай. Бул каталар сыяктуу олуттуу каталар эмес, бирок алар биздин көңүл буруубузду талап кылат. Бардык өзгөчөлүктөр 2 түргө бөлүнөт - текшерилген ( текшерилген ) жана белгиленбеген ( белгисиз ). Өзгөчө учурлар: текшерилген, белгиленбеген жана өзүңүздүн - 3Бардык текшерилген өзгөчөлүктөр Exception. "Текшерүүчү" деген эмнени билдирет? Биз муну акыркы лекцияда жарым-жартылай айтып өттүк : “...Java компилятору эң кеңири таралган өзгөчөлүктөр жөнүндө билет жана алар кандай кырдаалдарда болушу мүмкүн экенин билет.” Мисалы, ал билет, эгерде программист codeдогу файлдан маалыматтарды окуса, анда файл жок деген жагдай оңой эле келип чыгышы мүмкүн. Ал эми алдын ала айта турган мындай жагдайлар көп. Ошондуктан, компилятор потенциалдуу өзгөчөлүктөр үчүн биздин codeду алдын ала текшерет. Эгер аларды тапса, биз аларды иштетмейинче же жогору жакка жөнөтмөйүнчө, ал codeду түзбөйт. Өзгөчө экинчи түрү "текшерилбеген" болуп саналат. Алар класстан келишет RuntimeException. Алар текшерorп жаткандардан эмнеси менен айырмаланат? RuntimeExceptionОшондой эле белгилүү бир иштөө убактысынан өзгөчөлүктөрдөн келип чыккан жана сүрөттөгөн ар кандай класстардын бир тобу бар окшойт . Айырмасы, компилятор бул каталарды күтпөйт. Ал мындай дейт окшойт: «Кодду жазып жатканда мен шектүү эч нерсе тапкан жокмун, бирок ал иштеп жатканда бир нерсе туура эмес болуп калды. Кыязы, codeдо каталар бар окшойт!” Жана чындап эле ошондой. Текшерилбеген өзгөчөлүктөр көбүнчө программист каталарынын натыйжасы болуп саналат. Ал эми компилятор адамдар өз колдору менен түзө турган бардык мүмкүн болгон туура эмес кырдаалдарды камсыздай алbyte :) Ошондуктан, ал биздин codeубузда мындай өзгөчөлүктөр менен иштөөнү текшербейт. Сиз буга чейин бир нече текшерилбеген өзгөчөлүктөргө туш болдуңуз:
  • ArithmeticExceptionнөлгө бөлүнгөндө пайда болот
  • ArrayIndexOutOfBoundsExceptionМассивден тышкары уячага кирүүгө аракет кылганда пайда болот.
Албетте, теориялык жактан Java түзүүчүлөрү мындай өзгөчөлүктөрдү милдеттүү түрдө иштетүүнү киргизиши мүмкүн эле, бирок анда code кандай болмок? Сандарды бөлүү операциясы менен кокустан нөлгө бөлүнүп жатканыңызды текшерүү үчүн аракет кылып жазышыңыз керекпи? Массивге киргенде, сиз бул чектен чыгып кеткениңизди текшерүү үчүн try-catch жазууга туура келет. Жазылган ар кандай code спагетти жана таптакыр окулбай калат. Бул идеядан баш тартканы логикалуу. Ошондуктан, текшерилбеген өзгөчө учурларды try-catch блокторунда иштетүүнүн же жогоруга ыргытуунун кереги жок, бирок бул Катадагыдай техникалык жактан мүмкүн.

Сиздин өзгөчөлүгүңүздү кантип таштаса болот

Албетте, Java түзүүчүлөрү программаларда пайда болушу мүмкүн болгон бардык өзгөчө кырдаалдарды камсыз кыла алышпайт. Дүйнөдө өтө көп программалар бар жана алар өтө ар түрдүү. Бирок бул жакшы, анткени керек болсо өзүңүздүн өзгөчөлүктөрүңүздү түзө аласыз. Бул абдан оңой жасалат. Болгону өз классыңызды түзсөңүз болот. Анын аталышы "Exception" менен аякташы керек. Компиляторго мунун кереги жок, бирок сиздин codeуңузду окуган программисттер бул класстын өзгөчө класс экенин дароо түшүнүшөт. Мындан тышкары, класс класстан келгенин көрсөтүшүңүз керек Exception. Бул компилятор жана туура иштеши үчүн мурунтан эле керек. Мисалы, биз класстын Dog бар - Dog. Биз ит менен сейилдөөгө болот walk(). Бирок ага чейин биздин үй жаныбарыбыздын жакасы, боосу жана тумшугу бар-жогун текшеришибиз керек. Булардын бири жок болсо, биз өзүбүздүн өзгөчөлүктү ыргытабыз DogIsNotReadyException. Анын codeу мындай болот:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Класс өзгөчө экенин көрсөтүү үчүн класстын аталышынан кийин Exception кеңейтүүсүн жазышыңыз керек : бул "класс Exception классынан келип чыккан" дегенди билдирет. Конструктордо класстын конструкторун жөн гана Exceptionсызык менен чакырабыз message- ал колдонуучуга системадан келип чыккан катаны сүрөттөгөн билдирүүнү көрсөтөт. Бул биздин класс codeубузда кандай болот:
public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;

   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("Let's go for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hurrah, let's go for a walk!" + name + " I am glad!");
   } else {
       throw new DogIsNotReadyException("Dog " + name + "not ready for a walk! Check your gear!");
   }
 }

}
Эми биздин ыкма walk()өзгөчө учурду жаратат DogIsNotReadyException. Бул ачкыч сөз менен жасалат throw. Жогоруда айтылгандай, өзгөчө an object болуп саналат. Ошондуктан, биздин методубузда өзгөчө кырдаал пайда болгондо - итке бир нерсе жетишпейт - биз жаңы класс an objectин түзүп DogIsNotReadyException, сөздү колдонуп программага ыргытабыз throw. Метод кол тамгасына walk()ыргытууну кошобуз DogIsNotReadyException. walk()Башка сөз менен айтканда, компилятор методдун чакыруусу өзгөчө кырдаалга алып келиши мүмкүн экенин билет . Ошентип, биз муну программанын бир жерине чакырганда, өзгөчөлүктү чечүү керек болот. Муну ыкма менен жасоого аракет кылалы main():
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();//Unhandled exception: DogIsNotReadyException
}
Компиляция кылынbyte, өзгөчө жагдай каралbyte! try-catchКелгиле, өзгөчө кырдаалды чечүү үчүн codeубузду блокко ороп көрөлү :
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking equipment! Is the collar on?" + dog.isCollarPutOn + "\r\n Is the leash on?"
       + dog.isLeashPutOn + "\r\n Are you wearing a muzzle?" + dog.isMuzzlePutOn);
   }
}
Эми консолдун натыйжасын карап көрөлү:

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
Консолдун чыгышы канчалык маалыматтуу болуп калганын караңыз! Программада болгон ар бир кадамды көрүп турабыз; Ката кайдан болгонун көрүп, итибизге эмне жетишпей жатканын дароо байкайбыз :) Мына ушинтип өзүбүздүн өзгөчөлүктөрүбүздү түзөбүз. Көрүнүп тургандай, татаал эч нерсе жок. Java иштеп чыгуучулары туура эмес жабдылган иттер үчүн өз тorне өзгөчө өзгөчөлүк кошууга убара болушпаса да, биз алардын көзөмөлүн оңдодук :)
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION