OCA Java imtahan mövzuları

Runtime&Checked Exceptions. Errors

Runtime Exceptions

Runtime exception’lar RuntimeException classından törənmiş exception’lardır. Bu exception’lar handle və declare olunmağı tələb etmir. Həm proqramçı, həm də JVM tərəfindən fırlada bilər. Ən çox istifadə edilən runtime exception’lar bunlardır:

 

ArithmeticException

Sıfıra bölmə əməliyyatına cəhd zamanı baş verir və JVM tərəfindən fırladılır.

   int result = 7 / 0;

Output:

   Exception in thread "main" java.lang.ArithmeticException: / by zero

 

ArrayIndexOutOfBoundsException

Massivin doğru indeksinə müraciət etmədikdə baş verir və JVM tərəfindən fırladılır.

int arr[] = new int[3];
for(int i=0; i<=arr.length; i++) {
    System.out.print(arr[i] + " ");
}

Output:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

 

ClassCastException

Uyğun olmayan tipləri bir-birinə cast edən zaman yaranır və JVM tərəfindən fırladılır. Bəzən compiler qeyri-mümkün castların qarşısını alır:

String type = "number";
Integer number = (Integer)type;  // DOES NOT COMPILE

Integer String`in subclassı deyil, ona görə də compile xətası baş verir. Əgər biz String referansını əvvəlcə Object tipinə, sonra Integer tipinə cast etsək compile xətası baş verməyəcək, amma ClassCastException baş verəcək:

String type = "number";
Object obj = type;
Integer number = (Integer)obj;

Output:

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

 

IllegalArgumentException

Çox vaxt metoda düzgün parametr göndərməyəndə baş verir və proqramçı tərəfindən fırladılır. Tutaq ki, bir setter metodumuz var və mənfi parametr qəbul edə bilməz:

public void setCountStudents(int countStudents){
   if(countStudents >= 0 )
      this.countStudents = countStudents;
}

Bu kod normal işləyir, lakin mənfi parametr göndərdikdə requestdən imtina (ignore) edilir və bu metodu çağıranın (caller) bundan xəbəri olmur. Amma biz istəyirik ki, baş verən problem barədə proqramçını xəbərdar edək və o, bu problemi həll etsin. Bu zaman  IllegalArgumentException istifadə etmək tam məqsədəuyğun olur:

public void setCountStudents(int countStudents) {
    if (countStudents < 0) 
        throw new IllegalArgumentException("# count must not be negative");
    this.countStudents = countStudents;
}

Əgər metoda mənfi parametr göndərilsə, o zaman aşağıdakı kimi xəbərdarlıq çıxacaq:

Exception in thread "main" java.lang.IllegalArgumentException: # count must not be negative

 

NullPointerException

Instance dəyişən və metodlar null referans üzərindən çağırılan zaman baş verir və JVM tərəfindən fırladılır.

String name;
public void printLength() throws NullPointerException {
    System.out.println(name.length());
}

Output:

Exception in thread "main" java.lang.NullPointerException

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

class TestClass {
   public static void main(String args[]) throws Exception {
       Exception e = null;
       throw e;  // throws NullPointerException
   }
}

 

NumberFormatException

Uyğun formatda olmayan String`i numeric tipə çevirən zaman baş verir və proqramçı tərəfindən fırladılır. NumberFormatException classı IllegalArgumentException`un subclassıdır.

   Integer.parseInt("num");

Output:

Exception in thread "main" java.lang.NumberFormatException: For input string: "num"

 

 

Checked Exceptions

Exception və ondan törəyən bütün subclasslar (RuntimeException classı istisna olmaqla) bu exceptiona daxildir. Mütləq handle və ya declare olunmalıdırlar. Proqramçı və ya JVM tərəfindən fırladıla bilər. Ən çox istifadə edilən checked exceptionlar bunlardır:

 

IOException

Faylın oxunması və ya yazılması zamanı problem baş verdikdə yaranır (proqramçı tərəfindən fırladılır).

 

FileNotFoundException

Mövcud olmayan fayla müraciət etməyə çalışdıqda baş verir. IOException`un subclassıdır (proqramçı tərəfindən fırladılır).

 

OCA imtahanı üçün bu məlumatları bilmək yetərlidir. Bu iki exceptionu detallı şəkildə OCP imtahanında görəcəksiniz.

 

 

Errors

Error`lar Error classından törəyir və JVM tərəfindən fırladılır. Declare və ya handle olunmağı məsləhət görülmür. Errorlar nadir hallarda baş verir, OCA imtahanında əsas bu errorları görə bilərsiz:

 

ExceptionInInitializerError

Static initializer blokda exception baş verdikdə və handle olunmadıqda yaranır və JVM tərəfindən fırladılır. ExceptionInInitializerError ona görə error hesab olunur ki, Java bütünlüklə classın yüklənməsini dayandırır. Çünki classa müraciət olunan zaman ilk olaraq static initializer blok işə düşür və əgər həmin blokda exception baş verirsə, Java classdan istifadəyə başlaya bilmir.

public class ExceptionInIntializerError {

    static {
        int[] numbers = new int[3];
        int num = numbers[-1];
    }

    public static void main(String[] args) {
    }
}

Output:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1

Exception static blokda baş verdiyindən ExceptionInInitializerError alırıq. Amma bu errorla bağlı məlumat problemi həll etmək üçün yetərli olmadığından static blokda baş vermiş exceptionla bağlı məlumat da əlavə olaraq göstərilir.

 

StackOverflowError

Əsasən metod özü özünü çağıraraq sonsuz dövrə düşdüyündə (infinite recursion) baş verir və JVM tərəfindən fırladılır:

public static void recursiveMethod(int i){
    recursiveMethod(7);
}

Output:

Exception in thread "main" java.lang.StackOverflowError

Metod təkrar-təkrar özünü çağırır və sonlanmır. Nəhayət, stack ehtiyatlar tükənir və error baş verir. Bu “infinite recursion” adlanır. Infinite recursion infinite loop’a nisbətən daha “yaxşı” hesab olunur, çünki Java sonunda onu yaxalayır və error verir. Amma infinite loop onu “kill” etməyənə qədər bütün CPU resurslarını istifadə edir.

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

class Recursive{
    // Recursive obj = new Recursive();      // throws StackOverflowError
    static Recursive obj = new Recursive();  // no exceptions
    int[] ia = new int[1000];
    public static void main(String[] args) {
        Recursive ro = new Recursive();
    }
}

 

NoClassDefFoundError

Compile vaxtı mövcud olan classın runtime vaxtı tapılmaması zamanı baş verir və JVM tərəfindən fırladılır. Bu error imtahanda kod daxilində istifadə olunmur, sadəcə bilməliyik ki, bu errordur.

 

Bu errorlarla bağlı daha ətraflı məlumat üçün aşağıdakı linkə baxa bilərsiniz:

http://www.coderanch.com/t/655737/ocajp/certification/ExceptionInInitializerError-NoClassDefFoundError

 

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