JavaRush /Java блогы /Random-KK /Ерекшеліктер: тексерілген, белгіленбеген және өзіңіздікі

Ерекшеліктер: тексерілген, белгіленбеген және өзіңіздікі

Топта жарияланған
Сәлеметсіз бе! Өткен лекцияда біз Java тілінің ерекше жағдайлар сияқты аспектісімен таныстық және олармен жұмыс істеу мысалдарын көрдік. Бүгін біз олардың құрылымын тереңірек қарастырамыз, сонымен қатар өз ерекшеліктерімізді қалай жазу керектігін үйренеміз :)

Ерекшеліктер түрлері

Жоғарыда айтқанымыздай, Java-да 400-ге жуық ерекшелік кластары бар! Бірақ олардың барлығы топтарға бөлінген, сондықтан оларды есте сақтау өте оңай. Мынадай көрінеді: Ерекшеліктер: тексерілген, белгіленбеген және өзіңіздікі - 2Барлық ерекшеліктердің ортақ ата класы бар Throwable. Одан екі үлкен топ шығады - ерекшеліктер (Ерекше) және қателер (Қате). Қате – Java виртуалды машинасының жұмысымен байланысты бағдарламаны орындау кезіндегі маңызды қате. Көп жағдайда Қатені өңдеу қажет емес, себебі ол codeтағы кейбір елеулі кемшіліктерді көрсетеді. Ең танымал қателер: StackOverflowError- мысалы, әдіс өзін шексіз шақырғанда пайда болады және OutOfMemoryError- жаңа an objectілерді құру үшін жады жеткіліксіз болғанда пайда болады. Көріп отырғаныңыздай, мұндай жағдайларда көбінесе өңдеуге ерекше ештеңе болмайды - code жай ғана қате жазылған және қайта өңдеуді қажет етеді. Ерекшеліктер , шын мәнінде, ерекшеліктер: бағдарлама жұмыс істеп тұрған кезде орын алған ерекше, жоспарланбаған жағдай. Бұл қателер сияқты маңызды қателер емес, бірақ олар біздің назарымызды қажет етеді. Барлық ерекшеліктер 2 түрге бөлінеді - тексерілген ( тексерілген ) және белгіленбеген ( белгіленбеген ). Ерекшеліктер: тексерілген, белгіленбеген және өзіңіздікі - 3Барлық тексерілген ерекшеліктер ішінен келеді Exception. «Тексерілетін» деген нені білдіреді? Біз бұл туралы соңғы дәрісте ішінара айттық : «...Java компиляторы ең жиі кездесетін ерекшеліктер туралы біледі және олардың қандай жағдайларда орын алуы мүмкін екенін біледі». Мысалы, ол біледі, егер бағдарламашы codeтағы файлдағы деректерді оқыса, файл жоқ деген жағдай оңай туындауы мүмкін. Ал оның алдын ала болжайтын мұндай жағдайлары өте көп. Сондықтан компилятор ықтимал ерекшеліктер үшін біздің codeты алдын ала тексереді. Егер ол оларды тапса, біз оларды өңдемейінше немесе жоғарыға жібермейінше, ол codeты құрастырмайды. Ерекшеліктің екінші түрі – «тексерілмеген». Олар сыныптан келеді RuntimeException. Олардың сыналғандардан қандай айырмашылығы бар? RuntimeExceptionБелгілі бір орындалу уақытының ерекшеліктерін сипаттайтын және сипаттайтын әртүрлі сыныптардың тобы да бар сияқты . Айырмашылығы мынада, компилятор бұл қателерді күтпейді. Ол: «Кодты жазу кезінде мен күдікті ештеңе таппадым, бірақ ол жұмыс істеп тұрған кезде бірдеңе дұрыс болмады. Кодта қателер бар сияқты!» Және шынымен де солай. Тексерілмеген ерекшеліктер көбінесе бағдарламашы қателерінің нәтижесі болып табылады. Ал компилятор адамдар өз қолдарымен жасай алатын барлық ықтимал қате жағдайларды қамтамасыз ете алмайтыны анық :) Сондықтан ол біздің codeымызда мұндай ерекшеліктерді өңдеуді тексермейді. Бірнеше тексерілмеген ерекше жағдайларды кездестірдіңіз:
  • ArithmeticExceptionнөлге бөлгенде пайда болады
  • ArrayIndexOutOfBoundsExceptionЖиымнан тыс ұяшыққа кіру әрекеті кезінде пайда болады.
Теориялық тұрғыдан, әрине, Java-ны жасаушылар мұндай ерекшеліктерді міндетті түрде өңдеуді енгізе алар еді, бірақ ол кезде code қандай болады? Сандарды бөлудің кез келген операциясымен кездейсоқ нөлге бөлінетінін тексеру үшін try-catch жазу керек пе? Жиымға қол жеткізген кезде, осы шектеулерден асып кеткеніңізді тексеру үшін try-catch жазуыңыз керек. Жазылған кез келген code спагетти болады және мүлдем оқылмайды. Бұл идеядан бас тартқаны қисынды. Сондықтан, тексерілмеген ерекшеліктерді try-catch блоктарында өңдеу немесе жоғарғы жағына тастау қажет емес, дегенмен бұл Қате сияқты техникалық мүмкін.

Ерекшелікті қалай тастауға болады

Әрине, Java-ны жасаушылар бағдарламаларда туындауы мүмкін барлық ерекше жағдайларды қамтамасыз ете алмайды. Әлемде тым көп бағдарламалар бар және олар тым әртүрлі. Бірақ бұл жақсы, өйткені қажет болған жағдайда өзіңіздің ерекше жағдайларыңызды жасай аласыз. Бұл өте оңай жасалады. Сізге тек өз класыңызды құру жеткілікті. Оның атауы «Ерекше» дегенмен аяқталуы керек. Бұл компиляторға қажет емес, бірақ сіздің 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
}
Компиляция жасамайды, ерекшелік өңделмейді! 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 әзірлеушілері дұрыс жабдықталмаған иттер үшін өз тіліне ерекше ерекшелік қосуға алаңдамаса да, біз олардың қадағалауын түзеттік :)
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION