JavaRush /Java Blogu /Random-AZ /İstisnalar: yoxlanılmış, yoxlanılmış və öz

İstisnalar: yoxlanılmış, yoxlanılmış və öz

Qrupda dərc edilmişdir
Salam! Keçən mühazirədə Java dilinin istisnalar kimi bir aspekti ilə tanış olduq və onlarla işləmək nümunələrini gördük. Bu gün onların strukturuna daha dərindən nəzər salacağıq, həmçinin öz istisnalarımızı necə yazacağımızı öyrənəcəyik :)

İstisna növləri

Dediyimiz kimi, Java-da bir çox istisna sinifləri var, demək olar ki, 400! Lakin onların hamısı qruplara bölünür, ona görə də onları yadda saxlamaq olduqca asandır. Göründüyü kimi: İstisnalar: yoxlanılmış, yoxlanılmış və öz - 2Bütün istisnalar ümumi əcdad sinfinə malikdir Throwable. Ondan iki böyük qrup gəlir - istisnalar (İstisna) və səhvlər (Səhv). Səhv, Java virtual maşınının işləməsi ilə əlaqəli proqramın icrası zamanı kritik xətadır. Əksər hallarda, Xətanın idarə edilməsinə ehtiyac yoxdur, çünki bu, kodda bəzi ciddi qüsurları göstərir. Ən məşhur səhvlər: StackOverflowError- məsələn, metod sonsuz olaraq özünü çağırdıqda və OutOfMemoryError- yeni obyektlər yaratmaq üçün kifayət qədər yaddaş olmadıqda baş verir. Gördüyünüz kimi, bu vəziyyətlərdə çox vaxt emal etmək üçün xüsusi bir şey yoxdur - kod sadəcə səhv yazılmışdır və yenidən işlənməlidir. İstisnalar , əslində, istisnalardır: proqram işləyərkən baş verən müstəsna, planlaşdırılmamış vəziyyət. Bunlar Səhv qədər ciddi səhvlər deyil, lakin diqqətimizi tələb edir. Bütün istisnalar 2 növə bölünür - yoxlanılmış ( yoxlanılmış ) və işarəsiz ( işarəsiz ). İstisnalar: yoxlanılmış, yoxlanılmış və öz - 3Bütün yoxlanılan istisnalar Exception. "Yoxlanılan" nə deməkdir? Biz bunu sonuncu mühazirədə qismən qeyd etdik : “...Java tərtibçisi ən çox yayılmış istisnaları bilir və onların hansı hallarda baş verə biləcəyini bilir.” Məsələn, o bilir ki, proqramçı bir fayldan məlumatları kodda oxuyarsa, faylın mövcud olmadığı vəziyyət asanlıqla yarana bilər. Və onun əvvəlcədən proqnozlaşdıra biləcəyi bir çox belə vəziyyətlər var. Buna görə də, kompilyator potensial istisnalar üçün kodumuzu əvvəlcədən yoxlayır. Əgər onları tapsa, biz onları emal edənə və ya yuxarıya yönləndirənə qədər kodu tərtib etməyəcək. İkinci növ istisna "yoxlanılmamışdır". Sinifdən gəlirlər RuntimeException. Onlar sınaqdan keçənlərdən nə ilə fərqlənir? Görünür ki, RuntimeExceptionmüəyyən iş vaxtı istisnalarından gələn və təsvir edən bir çox müxtəlif siniflər də var. Fərq ondadır ki, kompilyator bu səhvləri gözləmir. O, deyəsən deyir: “Kodu yazarkən mən şübhəli heç nə tapmadım, amma işləyərkən nəsə səhv oldu. Görünür, kodda səhvlər var!” Və həqiqətən də belədir. Yoxlanılmamış istisnalar çox vaxt proqramçı səhvlərinin nəticəsidir. Və kompilyator insanların öz əlləri ilə yarada biləcəyi bütün mümkün yanlış vəziyyətləri təmin edə bilmir :) Buna görə də kodumuzda bu cür istisnaların işlənməsini yoxlamaz. Artıq bir neçə yoxlanılmamış istisnalarla qarşılaşmısınız:
  • ArithmeticExceptionsıfıra bölündükdə baş verir
  • ArrayIndexOutOfBoundsExceptionMassivdən kənar hüceyrəyə daxil olmaq istəyərkən baş verir.
Teorik olaraq, əlbəttə ki, Java yaradıcıları bu cür istisnaların məcburi idarə edilməsini tətbiq edə bilərdilər, lakin o zaman kod necə olacaq? Ədədlərin bölünməsi ilə bağlı hər hansı əməliyyatla təsadüfən sıfıra bölündüyünüzü yoxlamaq üçün bir cəhd yazmalısınız? Massivə daxil olduqda, bu hədləri keçib-keçmədiyinizi yoxlamaq üçün cəhd-tutmaq yazmalı olacaqsınız. Yazılan hər hansı kod spagetti və tamamilə oxunmaz olardı . Bu fikirdən imtina etməsi məntiqlidir. Buna görə də, yoxlanılmamış istisnaları try-catch bloklarında idarə etmək və ya yuxarıya atmaq lazım deyil, baxmayaraq ki, bu, Error-da olduğu kimi texniki cəhətdən mümkündür.

İstisnanızı necə atmaq olar

Təbii ki, Java-nın yaradıcıları proqramlarda yarana biləcək bütün müstəsna halları təmin edə bilmirlər. Dünyada çoxlu proqramlar var və onlar çox fərqlidir. Ancaq bu yaxşıdır, çünki lazım gələrsə, öz istisnalarınızı yarada bilərsiniz. Bu çox asanlıqla edilir. Sizə lazım olan tək şey öz sinfinizi yaratmaqdır. Onun adı “İstisna” ilə bitməlidir. Kompilyatorun buna ehtiyacı yoxdur, lakin kodunuzu oxuyan proqramçılar bunun istisna sinif olduğunu dərhal başa düşəcəklər. Bundan əlavə, sinfin sinifdən gəldiyini göstərməlisiniz Exception. Bu, kompilyator və düzgün işləmək üçün artıq lazımdır. Məsələn, bir sinif itimiz var - Dog. istifadə edərək iti gəzdirə bilərik walk(). Ancaq bundan əvvəl, ev heyvanımızın yaxası, kəməri və ağızlığı olub olmadığını yoxlamaq lazımdır. Bunlardan hər hansı biri əskik olarsa, öz istisnamızı atacağıq DogIsNotReadyException. Onun kodu belə görünəcək:
public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Sinfin istisna olduğunu göstərmək üçün sinif adından sonra Exception genişlətmələri yazmalısınız : bu o deməkdir ki, “sinif İstisna sinifindən yaranır”. Konstruktorda biz sadəcə olaraq sinif konstruktorunu Exceptionxətt ilə çağıracağıq message- o, istifadəçiyə baş vermiş xətanı təsvir edən sistemdən mesaj göstərəcək. Sinif kodumuzda belə görünəcək:
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!");
   }
 }

}
İndi metodumuz walk()bir istisna atır DogIsNotReadyException. Bu açar sözdən istifadə etməklə edilir throw. Daha əvvəl dediyimiz kimi, istisna obyektdir. Buna görə də bizim metodumuzda müstəsna vəziyyət yarandıqda - itdə nəsə çatışmır - biz yeni sinif obyekti yaradırıq DogIsNotReadyExceptionvə sözündən istifadə edərək onu proqrama atırıq throw. Metod imzasına walk()atışlar əlavə edirik DogIsNotReadyException. Başqa sözlə, tərtibçi artıq metod çağırışının walk()istisna ilə nəticələnə biləcəyini bilir. Beləliklə, biz bunu proqramda bir yerə çağırdığımızda, istisnanı idarə etmək lazımdır. Bunu üsulla etməyə çalışaq main():
public static void main(String[] args) {

   Dog dog = new Dog("Mukhtar");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();//Unhandled exception: DogIsNotReadyException
}
Tərtib etmir, istisna idarə edilmir! try-catchİstisnanı idarə etmək üçün kodumuzu bloka sarıyaq :
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);
   }
}
İndi konsol çıxışına baxaq:

Ошейник надет! 
Намордник надет! 
Собираемся на прогулку! 
Собака Мухтар не готова к прогулке! Проверьте экипировку! 
Проверяем снаряжение! Ошейник надет? true
Поводок надет? false 
Намордник надет? true
Görün, konsol çıxışı nə qədər məlumatlı oldu! Proqramda baş verən hər addımı görürük; Biz xətanın harada baş verdiyini görürük və itimizin tam olaraq nəyin çatışmadığını dərhal anlayırıq :) Öz istisnalarımızı belə yaradırıq. Gördüyünüz kimi, mürəkkəb bir şey yoxdur. Java tərtibatçıları səhv təchiz olunmuş itlər üçün dillərinə xüsusi bir istisna əlavə etməkdən narahat olmasalar da, biz onların nəzarətini düzəltdik :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION