İ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:
- Exception`un checked yaxud unchecked olduğunu təyin etməyi bacarmalıyıq;
- 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-cicatch
bloku icra olunacaq;ExhibitClosed
exceptionu baş versə, ancaq 2-cicatch
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ə AnimalsOutForAWalk
və ExhibitClosed
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]