OCA Java imtahan mövzuları

Catching Various Types of Exceptions

İndiyə kimi yazdığımız nümunələrdə try ifadəsində ancaq bir catch blokundan istifadə etdik, amma try ifadəsində catch bloklarının sayına məhdudiyyət qoyulmur, istənilən sayda catch bloku istifadə edilə bilər, amma müvafiq qaydalara riayət etməklə. Ümumiyyətlə, OCA imtahanında əsas (basic) exceptionlarla bağlı suallar düşür, öz yaratdığınız exceptionlarla bağlı və digər suallar əsasən OCP imtahanında soruşulur. OCA imtahanı üçün exceptionlarla bağlı əsas 2 şeyi bilməliyik:

  1. Exception`un checked yaxud unchecked olduğunu təyin etməyi bacarmalıyıq;
  2. Hansı exceptionun hansından törədiyini, başqa sözlə hansının super, hansının sub class olduğunu bilməliyik.
class AnimalsOutForAWalk extends RuntimeException {}

class ExhibitClosed extends RuntimeException {}

class ExhibitClosedForLunch extends ExhibitClosed {}

class CatchException {
    public void visitPorcupine(){
        try {
            seeAnimals();
        } catch (AnimalsOutForAWalk e) {
            System.out.println("catch block-1");
        } catch (ExhibitClosed e) {
            System.out.println("catch block-2");
        }
    } 
}

Yuxarıdakı nümunə üçün 3 mümkün hal var:

  • exception baş verməsə heç bir catch bloku icra olunmur;
  • AnimalsOutForAWalk exceptionu baş versə, ancaq 1-ci catch bloku icra olunacaq;
  • ExhibitClosed exceptionu baş versə, ancaq 2-ci catch bloku icra olunacaq.

Catch bloklarının sıralaması ilə bağlı bilməli olduğumuz çox vacib bir qayda var: catch blokunda exceptionlar sub classdan super classa doğru sıralanmalıdır. Çünki catch bloklarının sayından asılı olmayaraq, istənilən halda ancaq bir catch bloku icra olunur və bu baş verən exceptiona uyğun gələn birinci catch bloku olur. Ona görə də əgər super class sub classdan əvvəl gələrsə, subclassa uyğun gələn exceptionu artıq super class yaxalayacaq və sub classın super classdan sonra gəlməsinin heç bir əhəmiyyəti qalmayacaq. Bu səbəbdən super classdan sonra gələn sub class “unreachable statement” hesab edilir və compile olunmur.

Yuxarıdakı nümunədə AnimalsOutForAWalkExhibitClosed exceptionlarının sırasını dəyişdirsək, heç bir xəta baş vermədən kod yenə compile olunacaqdır. Çünki bu exceptionlar bir-birindən törəməyib, hər ikisi RuntimeException classından törədiyinə görə paralel hüquqlu sayılır, ona görə də yerlərini dəyişmək mümkündür.

Aşağıdakı nümunədə isə subclass-superclass ardıcıllığına riayət olunur:

public void visitMonkeys() {
    try {
        seeAnimals();
    } catch (ExhibitClosedForLunch e) {  // subclass exception
        System.out.println("subclass");
    } catch (ExhibitClosed e) {          // superclass exception
        System.out.println("superclass");
    }
}

Yuxarıdakı nümunədə əgər subclassla superclass exceptionun yerini dəyişsək compile xətası alacağıq.

Sıralamanın pozulması ilə bağlı başqa bir nümunəyə baxaq:

public void visitSnakes() {
    try {
        seeAnimals();
    } catch (RuntimeException e) {
        System.out.println("runtime exception");
    } catch (ExhibitClosed e) {    // DOES NOT COMPILE      
        System.out.println("exhibit closed exception");
    } catch (Exception e) {
        System.out.println("exception");
    } catch (Exception e) {        // DOES NOT COMPILE, because of duplicate   
        System.out.println("exception");
    }
}

 

[topics lang=az]

 

About the author

Mushfiq Mammadov

Leave a Comment


The reCAPTCHA verification period has expired. Please reload the page.

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.