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: Bütün istisnalar ümumi əcdad sinfinə malikdirThrowable
. 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 ). Bü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, RuntimeException
müə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:
ArithmeticException
sıfıra bölündükdə baş verirArrayIndexOutOfBoundsException
Massivdən kənar hüceyrəyə daxil olmaq istəyərkən baş verir.
İ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əlisinizException
. 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 Exception
xə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 DogIsNotReadyException
və 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 :)
GO TO FULL VERSION