"Java Exception və Error"

Java-da, "exception" və "error" anlayışları proqramın normal işini pozan halları təsvir edir. Hər ikisi "Throwable" sinifinin alt sinifləridir, lakin fərqli mənaları və istifadə sahələri var.

8 İyun 2024 - 17:58
 0  70
"Java Exception və Error"
Java Azərbaycan

Exception

Exception sinfi proqramın iş zamanı meydana çıxan və tutula bilən (yəni, həll edilə bilən) problemləri təsvir edir. Bu problemlər adətən proqramın məntiqindəki səhvlərdən və ya gözlənilməyən vəziyyətlərdən qaynaqlanır. İki əsas alt sinifə malikdir:

  1. Checked Exceptions: Bu növ səhvlər proqramın işləmə vaxtında meydana gələ bilər və onları kodda mütləq işləmək lazımdır. Bu növ səhvlər üçün "try-catch" bloklarından istifadə olunur və ya metodu elan edərkən throws açar sözü ilə göstərilməlidir. Məsələn:

    • IOException
    • SQLException
  2. Unchecked Exceptions: Bu növ səhvlər "RuntimeException" sinifindən törəyir və kod tərəfindən məcburi işlənməyə ehtiyac yoxdur. Bu səhvlər adətən proqramın məntiqindəki səhvlərdən qaynaqlanır. Məsələn:

    • NullPointerException
    • ArrayIndexOutOfBoundsException

Nümunə:

public class Main {
    public static void main(String[] args) {
        try {
            int result = divide(10, 0);
        } catch (ArithmeticException e) {
            System.out.println("ArithmeticException caught: " + e.getMessage());
        }

        try {
            String text = null;
            System.out.println(text.length());
        } catch (NullPointerException e) {
            System.out.println("NullPointerException caught: " + e.getMessage());
        }

        try {
            int[] numbers = new int[3];
            System.out.println(numbers[10]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("ArrayIndexOutOfBoundsException caught: " + e.getMessage());
        }
    }

    public static int divide(int a, int b) throws ArithmeticException {
        return a / b;
    }
}

Bu nümunədə müxtəlif növ "Unchecked Exceptions" işlənir:

  • ArithmeticException sıfıra bölmə səhvini göstərir.
  • NullPointerException null obyektə müraciəti göstərir.
  • ArrayIndexOutOfBoundsException massiv sərhədlərini aşan indeksi göstərir.

Bu kodda göstərilən səhvlər "Checked Exceptions" deyil, çünki onlar proqramın məntiqindəki səhvləri təmsil edir və işlənməsi məcburi deyil, lakin proqramın çöküşünün qarşısını almaq üçün tövsiyə olunur.

Error

Error sinfi isə ciddi problemləri və proqramın normal gedişatında bərpa edilə bilməyən səhvləri təsvir edir. Bu problemlər adətən JVM (Java Virtual Machine) səviyyəsində baş verir və proqram tərəfindən işlənməsi nəzərdə tutulmur. Məsələn:

  • OutOfMemoryError
  • StackOverflowError

Bu növ səhvlər üçün "try-catch" blokları adətən istifadə edilmir, çünki bu halların qarşısını almaq və ya bərpa etmək çox çətindir.

Java-da Error sinifinə aid bir nümunə kod yazmaq daha çətindir, çünki Error-lar JVM səviyyəsində ciddi problemlərdən qaynaqlanır və onları süni şəkildə yaratmaq adətən məsləhət deyil. Bununla belə, bəzi Error-ların yaranma səbəblərini göstərmək üçün nümunə kod təqdim edə bilərik. Məsələn, StackOverflowErrorOutOfMemoryError-u nümunə kimi göstərmək olar.

StackOverflowError

StackOverflowError adətən sonsuz rekurziya səbəbindən yaranır. Aşağıda bu səhvin yaranma nümunəsi var:

public class Main {
    public static void main(String[] args) {
        try {
            recursiveMethod();
        } catch (StackOverflowError e) {
            System.out.println("StackOverflowError caught: " + e.getMessage());
        }
    }

    public static void recursiveMethod() {
        recursiveMethod();
    }
}

Bu kodda recursiveMethod metodu sonsuz rekursiya edir, bu da StackOverflowError-a səbəb olur.

OutOfMemoryError

OutOfMemoryError adətən JVM-ə ayrılmış yaddaşın tükənməsi səbəbindən yaranır. Aşağıda bu səhvin yaranma nümunəsi var:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        try {
            List list = new ArrayList<>();
            while (true) {
                list.add(new int[1_000_000]);
            }
        } catch (OutOfMemoryError e) {
            System.out.println("OutOfMemoryError caught: " + e.getMessage());
        }
    }
}

Bu kodda böyük ölçüdə massivlər əlavə edilərək JVM yaddaşı doldurulur və nəticədə OutOfMemoryError yaranır.

Diqqət

Bu nümunələrdə göstərilən Error-lar süni şəkildə yaradılıb və bu kodlar real dünyada istifadə edilməməlidir. Bu cür Error-ları idarə etmək əvəzinə, onların yaranma səbəblərini anlayıb, proqramın dizaynında və konfiqurasiyasında dəyişikliklər etməklə bu problemlərin qarşısını almaq lazımdır.