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:
[topics lang=az]