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()
və 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]