1. İstisnalarla tanışlıq
Gəlin sadə bir analogiyadan başlayaq. Təsəvvür edin ki, proqramınız — yolda gedən avtomobildir. Hər şey qaydasındadır, ta ki qəfil nəsə baş verməsin: təkər deşilib, benzin qurtarıb, mühərrik qızıb. Bu vəziyyəti «emal» etməsəniz (məsələn, ehtiyat təkəri qoymasanız və ya yanacaq doldurmasanız), maşın dayanacaq və daha getməyəcək. Proqramda da eyni qaydada: istisnanı emal etməsəniz, proqram qəza ilə dayanacaq.
İstisna (exception) — icra zamanı hər hansı problem yarandıqda yaradılan obyektdir. İstisna xəbər verir: «Dayan! Nəsə qaydasında deyil!»
İstisnaların yarandığı situasiyalara nümunələr:
- Sıfıra bölmə (10 / 0)
- Mövcud olmayan massiv elementinə müraciət (arr[999])
- Diskdə mövcud olmayan faylın açılması
- "abc" sətrinin ədədə çevrilməsi (Integer.parseInt("abc"))
Vacibdir: İstisnalar — kompilyasiya xətaları (məsələn, kodda yazı səhvləri) deyil, proqram işləyən zaman yaranan problemlərdir.
Niyə istisnalar faydalıdır?
- Təmiz kod: Proqramın əsas məntiqi hər xırdalığa görə daimi yoxlamalarla çirklənmir.
- Elastiklik: Xətaları mərkəzləşdirilmiş şəkildə emal etmək olar (məsələn, bütün fayl oxuma xətalarını — bir yerdə).
- Etibarlılıq: Proqram müəmmalı bir mesajla «düşmək» əvəzinə, nə baş verdiyini konkret bildirir.
2. İstisnalar (Exceptions) vs Xətalar (Errors)
Java-da proqram işləyərkən yarana bilən iki əsas problem tipi var:
Xətalar (Errors)
Xətalar — Java virtual maşınının (JVM) özündə baş verən nasazlıqlardan qaynaqlanan fatal, bərpaolunmaz problemlərdir. Adətən kompüter resursları və ya JVM-in daxili nasazlıqları ilə bağlı olur.
Xəta nümunələri:
- OutOfMemoryError — yaddaş tükənib.
- StackOverflowError — yığının daşması (məsələn, sonsuz rekursiya səbəbindən).
Vacibdir: Belə xətaları, adətən, proqramda emal etməyə cəhd etməyə dəyməz.
İstisnalar (Exceptions)
İstisnalar — proqramın öhdəsindən gələ biləcəyi (və gəlməli olduğu) problemlərdir. Onlar proqram məntiqindəki səhvlərdən və ya xarici amillərdən (məsələn, istifadəçi gözləniləndən fərqli məlumat daxil edib) yarana bilər.
İstisna nümunələri:
- NullPointerException — null-u obyekt kimi istifadə etmək cəhdi.
- ArrayIndexOutOfBoundsException — massiv sərhədlərindən kənara çıxma.
- IOException — fayllarla işləyərkən xəta.
Java-da istisnalar iki növdür:
- Checked exceptions (yoxlanılan) — kompilyator onların emalını tələb edir (məsələn, IOException).
- Unchecked exceptions (yoxlanılmayan) — kompilyator emal etməyi tələb etmir (məsələn, NullPointerException).
Sxem: nələr harada yerləşir
graph TD
Throwable --> Error
Throwable --> Exception
Exception --> RuntimeException
Exception --> Checked["(digər Exceptions)"]
style Throwable fill:#ffa64d,color:#000
style Exception fill:#ffa64d,color:#000
style Checked fill:#ffa64d,color:#000
style Error fill:#ff4d4d,color:#fff
style RuntimeException fill:#4dff88,color:#000
İzah:
- Throwable — Java-da xətalar və istisnalar iyerarxiyasının kök sinfidir.
- Error — JVM-in fatal xətaları, emal olunmurlar.
- Exception — emal edilə bilən və edilməli olan “adi” istisnalardır.
- RuntimeException — yoxlanılmayan istisnalar (proqramçı səhvləri).
3. Bu, kodda necə görünür?
Nümunə 1: Sıfıra bölmə
public class ExceptionDemo
{
public static void main(String[] args)
{
int a = 10;
int b = 0;
int c = a / b; // Burada ArithmeticException yaranacaq!
System.out.println("Nəticə: " + c);
}
}
Nə baş verəcək?
Proqram xəta ilə dayanacaq və siz belə bir mesaj görəcəksiniz:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionDemo.main(ExceptionDemo.java:5)
Nümunə 2: Mövcud olmayan massiv elementinə müraciət
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException
Nümunə 3: Fayllarla iş
import java.io.FileReader;
import java.io.IOException;
public class FileDemo
{
public static void main(String[] args) throws IOException
{
FileReader reader = new FileReader("nofile.txt"); // FileNotFoundException (checked)
int data = reader.read();
System.out.println(data);
reader.close();
}
}
İndi isə bu cür istisna halları necə səliqəli şəkildə emal etməyi nəzərdən keçirəcəyik.
GO TO FULL VERSION