OCA Java imtahan mövzuları

Chapter 6 – Əlavələr

Coderanch forumundan götürülmüş maraqlı bir nümunəyə baxaq və özümüzü yoxlayaq. Aşağıdakı kod nümunəsi verilmişdir:

class FoodException extends Exception {}

class VeggieException extends FoodException {}

class Animal {
    public void eat() throws FoodException { 
        System.out.println("animal"); 
    }
}

class Elephant extends Animal {
    public void eat() { 
        System.out.println("elephant"); 
    }
}

class Tiger extends Animal {
    public void eat() throws VeggieException { 
        System.out.println("tiger"); 
    }
}

class Test {

    public void method1() {
        Animal a = new Animal();
        try {
            a.eat();
        } catch (FoodException e) {}
    }

    public void method2() {
        Animal a = new Elephant();
        a.eat();
    }

    public void method3() {
        Tiger t = new Tiger();
        try {
            t.eat();
        } catch (VeggieException e) {}
    }

    public void method4() {
        Elephant e = new Elephant();
        ((Animal)e).eat();
    }

    public void method5() throws Exception {
        Animal a = new Animal();
        ((Tiger) a).eat();
    }

    public void method6() throws FoodException {
        Animal a = new Elephant();
        ((Elephant)a).eat();
    }

    public void method7() {
        Animal a = new Elephant();
        try {
            ((Elephant)a).eat();
        } catch (FoodException e) {}
    }
}

Deməli Test classında 7 metod verilib. Bizdən nəyi tapmaq tələb olunur? Test classında verilmiş hansı metodlar:

1) compile olunmur?

2) compile olunur, amma run vaxtı exception verir?

3) compile olunur və run vaxtı heç bir exception baş vermir?

 

Cavab:

1)  method2(), method4(), method7()

2)  method5()

3)  method1(), method3(), method6()

 

method4() -də verilmiş cast ifadəsi:

   ((Animal) e).eat();

aşağıdakı kod ilə ekvivalentdir:

   Animal a = (Animal) e;

   a.eat();

method5()method6() -dakı cast ifadələri də yuxarıdakı məntiqə əsasən çalışır.

Sualla bağlı ətraflı izah aşağıdakı linkdə verilmişdir:

http://www.coderanch.com/t/651798/ocajp/certification/Mock-exam-wrong-answer-Java

 

Başqa bir nümunəyə baxaq:

import java.io.*;

class MyException extends FileNotFoundException {}

class TestExc {

    public static void main(String[] args) throws FileNotFoundException { // line1
        try {
            if (true)                     // line2 
                throw new MyException();  // line3 
            System.out.println("try ");   // line4 
        } catch (RuntimeException e) {
            System.out.println("catch ");
        } finally {
            System.out.println("finally ");
        }
    }
}

line3‘də MyException əvəzinə IOException yazsaq, kod compile olunmayacaq, çünki catch bloku checked exceptionu tuta bilmir, line1‘də də declare olunan exception da IOException'dan daha kiçik tipdir. line2‘ni commentə atsaq kod yenə compile olunmayacaq, çünki line4 “unreachable” kod hesab olunacaq.

Bir birindən törəmə classlar catch blokunda aşağıdakı şəkildə birgə işlədilə bilməz, ancaq paralel olanlara icazə verilir:

try{
   // something
} catch(ArrayIndexOutOfBoundsException | NullPointerException | RuntimeException e) {}  // DOES NOT COMPILE


try{
   // something
} catch(ArrayIndexOutOfBoundsException | NullPointerException | ClassCastException e) {}

 

Biz qeyd etdik ki, static blokda exception baş verərsə, bu zaman JVM tərəfindən ExceptionInInitializerError fırladılır. Amma static və instance initializer bloklarda birbaşa olaraq throw ilə exception fırlatdıqda compiler bunu qəbul etmir və xəta verir:

public class Test {

    static {   // DOES NOT COMPILE, initializer must be able to complete normally
        throw new NullPointerException();
    }

    {   // DOES NOT COMPILE, initializer must be able to complete normally.. 
        // həm də unreachable statement xətası verir. Əgər static blokla bu blokun 
        // yerini dəyişsək yenə də unreachable statement xətası bu blokda baş verəcək,
        // çünki compiler bilir ki, 1-ci static blok icra edilir..
        throw new ClassCastException();
    }
}

Əgər if(true) şərtini əlavə etsək, o zaman xəta aradan qalxacaq, çünki compiler if blokunun icra olunub olunmamasını ancaq run vaxtı müəyyən edir:

static {          
    if(true)
        throw new NullPointerException();
}

Amma if ilə belə yazdıqda ancaq RuntimeException fırlatmağa icazə verir, checked exception fırlatsaq compile xətası alacağıq:

static {
    if (true)
        throw new IOException();  // DOES NOT COMPILE
}

 

List/massivlərlə əlaqəli baş verəcək xətalarla bağlı bir nümunəyə baxaq:

public static void main(String[] args) {
    int[] ia = new int[]{1, 2, 3};    
    System.out.println(ia[-1]);  // throws ArrayIndexOutOfBoundsException

    int[] arrNegativeSize = new int[-5];  // throws NegativeArraySizeException
    List l = new ArrayList(-2);  // throws IllegalArgumentException: Illegal Capacity: -2
}

 

Facebook qrupumuzda bu mövzu ilə bağlı çox maraqlı bir sual paylaşılmışdı, screen edib qeydlərdə saxlamışdım:

class JavaClass {

    byte incrementAndGet() {
        byte b = 0b01110; // line 3
        try {
            String[] students = {"C", "C++", "Java", "JavaScript", "Python"};
            System.out.println(students[5]);
        } catch (Exception ex) {
            System.out.println("value of b in catch: " + b);
            return b;
        } finally {
            b++;
            System.out.println("value of b in finally: " + b);
        }
        return b; // line 7
    }

    public static void main(String[] args) {
        int i = new JavaClass().incrementAndGet(); // line 10
        System.out.println("Returned value in main() method: " + i);
    }
}

Which of the following statements are true? (Choose all that apply)

A) value of b in catch: 14
value of b in finally: 15

Returned value in main() method: 14

B) value of b in catch: 14
value of b in finally: 15

Returned value in main() method: 15

C) value of b in catch: 14
value of b in finally: 14

Returned value in main() method: 15

D) value of b in catch: 14
value of b in finally: 14

Returned value in main() method: 14

E) Compiler error at line 3

F) Compiler error at line 7

G) Compiler error at line 10

H) RuntimeException

I)  None of above

Düzgün cavaba və müzakirələrə aşağıdakı linkdən baxa bilərsiniz, amma əvvəlcə cavabı özünüz tapmağa çalışın:

https://www.facebook.com/groups/javacertification/permalink/902142646501541/

 

[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.