JavaRush /Java Blogu /Random-AZ /Java-da İstisnalar (Java İstisnası)

Java-da İstisnalar (Java İstisnası)

Qrupda dərc edilmişdir
Gündəlik həyatda bəzən planlaşdırmadığımız vəziyyətlər yaranır. Məsələn, səhər işə qalxırsınız, telefonunuz üçün şarj cihazı axtarırsınız, amma yoxdur. Üzünüzü yumaq üçün hamama gedirsiniz - su kəsilib. Maşına mindim və başlamadı. Ancaq insan belə gözlənilməz vəziyyətlərin öhdəsindən kifayət qədər asanlıqla gələ bilir. Bu məqalədə Java proqramlarının onlarla necə məşğul olduğunu anlamağa çalışacağıq.

İstisnalar hansılardır java

Proqramlaşdırma dünyasında proqramın icrası zamanı xətaların və gözlənilməz vəziyyətlərin baş verməsi istisna adlanır. Proqramda istifadəçinin səhv hərəkətləri, diskdə lazımi resursun olmaması və ya şəbəkə üzərindən serverlə əlaqənin kəsilməsi nəticəsində istisnalar baş verə bilər. Proqramın icrası zamanı istisnalar həmçinin proqramlaşdırma xətaları və ya API-nin düzgün istifadə edilməməsi nəticəsində yarana bilər. Dünyamızdan fərqli olaraq, proqram belə bir vəziyyətdə nə edəcəyini aydın şəkildə bilməlidir. Java bu məqsədlə istisna mexanizmi təqdim edir.

Açar sözlər haqqında qısaca cəhd edin, tutun, nəhayət, atır

Java-da istisnaların idarə edilməsi proqramda aşağıdakı açar sözlərdən istifadəyə əsaslanır:
  • cəhd - istisnanın baş verə biləcəyi kod blokunu müəyyənləşdirir;
  • catch – istisnanın işləndiyi kod blokunu müəyyən edir;
  • nəhayət – isteğe bağlı kod blokunu müəyyən edir, lakin əgər varsa, sınaq blokunun nəticələrindən asılı olmayaraq hər halda icra olunur.
Bu açar sözlər proqram kodunda xüsusi emal konstruksiyaları yaratmaq üçün istifadə olunur: cəhd{}tutmaq, cəhd{}tutmaq{}nəhayət, cəhd{}nəhayət{}.
  • atmaq – istisna yaratmaq üçün istifadə olunur;
  • throws - metodun bir istisna ata biləcəyini xəbərdar etmək üçün metod imzalarında istifadə olunur.
Java proqramında açar sözlərdən istifadə nümunəsi:
//method reads a string from the keyboard

public String input() throws MyException {//warn with throws,
// that the method can throw MyException
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String s = null;
// in the try block we enclose the code in which an exception can occur, in this
// if the compiler tells us that the readLine() method of the class
// BufferedReader may throw an I/O exception
    try {
        s = reader.readLine();
// in the catch block we enclose the code for handling the IOException exception
    } catch (IOException e) {
        System.out.println(e.getMessage());
// close the read stream in the finally block
    } finally {
// when closing the stream, an exception is also possible, for example, if it was not opened, so we “wrap” the code in a try block
        try {
            reader.close();
// write exception handling when closing the read stream
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    if (s.equals("")) {
// we decided that an empty string could disrupt the work of our program in the future, for example, on the result of this method, we need to call the substring(1,2) method, so we are forced to interrupt the program execution with the generation of our exception type MyException using throw
        throw new MyException("String can not be empty!");
    }
    return s;
}

Niyə bizə istisna mexanizmi lazımdır?

Gəlin real dünya nümunəsinə baxaq. Təsəvvür edin ki, magistralda yükgötürmə qabiliyyəti məhdud olan qəza körpüsü olan bir hissə var. Kütləsi körpünün yükgötürmə qabiliyyətini aşan avtomobil onun üzərindən keçərsə, o, çökə bilər və sürücü üçün vəziyyət yumşaq desək, müstəsna ola bilər. Bunun qarşısını almaq üçün yol xidməti əvvəlcədən yolda xəbərdarlıq nişanları quraşdırır. Avtomobilin sürücüsü xəbərdarlıq işarəsinə baxaraq, avtomobilinin çəkisini körpüdə sürməyə icazə verilən çəki ilə müqayisə edəcək. Əgər onu keçərsə, o, dolama yolu tutacaq. Yol xidmətinin hərəkətləri sayəsində yük avtomobillərinin sürücülərinə, ilk növbədə, marşrutlarını əvvəlcədən dəyişmək imkanı yaradılıb, ikincisi, əsas marşrut üzrə təhlükə barədə xəbərdarlıq edilib, nəhayət, istifadənin mümkünsüzlüyü barədə xəbərdarlıq edilib. müəyyən şərtlər altında körpü.
Java-da istisnalar - 2
Proqramdakı istisnanın qarşısını almaq və onun davam edə bilməsi üçün həll etmək bacarığı Java-da istisnalardan istifadənin səbəblərindən biridir. İstisna mexanizmi həm də daxil olan məlumatları təsdiqləməklə (yoxlamaqla) yazdığınız kodu (proqramlaşdırma interfeysi) istifadəçi tərəfindən sui-istifadədən qorumağa imkan verir. İndi bir saniyəlik yol polisi olaq. Əvvəlcə sürücülərin problemlə üzləşə biləcəyi yerləri bilməlisiniz. İkincisi, xəbərdarlıq nişanlarını hazırlamalı və quraşdırmalısınız. Nəhayət, əsas marşrutda təhlükə yaranarsa, dolama marşrutları təmin etməlisiniz. Java-da istisna mexanizmi oxşar şəkildə işləyir. Proqramın işlənib hazırlanması mərhələsində biz try{} blokundan istifadə etməklə kodun təhlükəli bölmələrini istisnalardan “qoruruq”, catch{} blokundan istifadə edərək “ehtiyat” yollarını təqdim edirik və son olaraq{} blokda biz proqramda icra olunan kodu yazırıq. istənilən nəticə üçün proqram. “Təcili marşrut” təqdim edə bilmədiyimiz və ya seçimi qəsdən istifadəçinin öhdəsinə buraxmaq istədiyimiz hallarda, heç olmasa, təhlükə barədə onu xəbərdar etməliyik. Niyə? Təsəvvür edin ki, yol boyu bir dənə də olsun xəbərdarlıq nişanı ilə qarşılaşmadan keçə bilməyən qəza körpüsünə çatacaq sürücünün qəzəbini! Proqramlaşdırmada, dərslərimizi və metodlarımızı yazarkən, biz həmişə onların proqramlarında digər tərtibatçılar tərəfindən istifadə kontekstini qabaqcadan görə bilmirik, buna görə də istisna vəziyyəti həll etmək üçün 100% düzgün yolu qabaqcadan görə bilmirik. Eyni zamanda, kodumuzdan istifadə edənləri istisnanın mümkünlüyü barədə xəbərdar etmək yaxşı təcrübədir. Java-nın istisna mexanizmi bizə bunu atışlardan istifadə etməklə etməyə imkan verir - mahiyyətcə istisna atmaq üçün metodumuzun ümumi davranışını elan edir və bununla da Java-da istisnanı idarə etmək üçün kod yazmağı metodun istifadəçisinə buraxır.

"Problem" xəbərdarlığı

Metodunuzda bir istisnanı idarə etməyi planlaşdırmasanız, lakin istifadəçiləri mümkün istisna vəziyyətləri haqqında metoddan xəbərdar etmək istəyirsinizsə, throws açar sözündən istifadə edin. Metod imzasındakı bu açar söz o deməkdir ki, müəyyən şərtlər altında metod istisna yarada bilər. Bu xəbərdarlıq metod interfeysinin bir hissəsidir və istifadəçiyə istisna işləyicisinin həyata keçirilməsini fərdiləşdirmək hüququ verir. Atışlardan sonra atılan istisnanın növünü göstəririk. Bunlar adətən Java İstisna sinifinin törəmələridir . Java obyekt yönümlü bir dil olduğundan, Java-dakı bütün istisnalar obyektlərdir.
Java-da istisnalar - 3

Java İstisna İerarxiyası

Proqramın icrası zamanı xəta baş verdikdə, JVM işləmə vaxtı Java istisna iyerarxiyasından tələb olunan tipli obyekt yaradır - ümumi "əcdaddan" miras qalmış mümkün istisnalar dəsti - Atılan sinif. Proqramda baş verən müstəsna halları iki qrupa bölmək olar:
  1. Proqramın sonrakı normal fəaliyyətinin bərpasının mümkün olmadığı vəziyyətlər
  2. Bərpa mümkündür.
Birinci qrupa Error sinfindən miras qalan istisnaların baş verdiyi vəziyyətlər daxildir . Bunlar JVM nasazlığı, yaddaşın daşması və ya sistem qəzası nəticəsində proqramın icrası zamanı baş verən səhvlərdir. Onlar adətən proqram təminatı ilə həll edilə bilməyən ciddi problemləri göstərir. Java-da bu növ istisna tərtib mərhələsində yoxlanılmamış kimi təsnif edilir. Bu qrupa RuntimeException da daxildir - istisnalar, proqramın icrası zamanı JVM tərəfindən yaradılan İstisna sinifinin varisləri. Onlar tez-tez proqramlaşdırma səhvlərindən qaynaqlanır. Bu istisnalar kompilyasiya zamanı da yoxlanılır, ona görə də onları idarə etmək üçün kod yazmağa ehtiyac yoxdur. İkinci qrupa proqramın yazılması mərhələsində nəzərdə tutulan və emal kodunun yazılmalı olduğu müstəsna hallar daxildir. Belə istisnalar yoxlanılır. İstisnalarla məşğul olan bir Java tərtibatçısının işinin əsas hissəsi bu cür vəziyyətləri idarə etməkdir.

İstisna yaratmaq

Proqramın icrası zamanı istisna JVM tərəfindən və ya throw ifadəsindən istifadə edərək əl ilə atılır . Bu, yaddaşda istisna obyekti yaradır və JVM istisna işləyicisi istisnanı idarə etmək üçün bir yol tapmağa çalışarkən əsas proqram kodunun icrasını dayandırır.

İstisna ilə işləmə

Java-da istisnalarla işləməyi təmin etdiyimiz kod bloklarının yaradılması proqramda try{}catch, try{}catch{}finally, try{}finally{} konstruksiyalarından istifadə etməklə həyata keçirilir.
Java-da istisnalar - 4
Bir sınaq blokunda bir istisna qaldırıldıqda, istisna işləyicisi aşağıdakı tutma blokunda axtarılır. Əgər tutmada bu növ istisna üçün işləyici varsa, idarəetmə ona keçir. Əks halda, JVM uyğun tutma tapılana qədər metod çağırışları zəncirində həmin istisna növü üçün işləyici axtarır. Tutmaq bloku icra edildikdən sonra nəzarət isteğe bağlı finally blokuna ötürülür . Uyğun tutma bloku tapılmadıqda, JVM proqramın icrasını dayandırır və metod çağırışları yığınını göstərir - stack trace , əgər varsa, əvvəllər son blok kodunu yerinə yetirmiş. İstisna ilə işləmə nümunəsi:
public class Print {

     void print(String s) {
        if (s == null) {
            throw new NullPointerException("Exception: s is null!");
        }
        System.out.println("Inside method print: " + s);
    }

    public static void main(String[] args) {
        Print print = new Print();
        List list= Arrays.asList("first step", null, "second step");

        for (String s:list) {
            try {
                print.print(s);
            }
            catch (NullPointerException e) {
                System.out.println(e.getMessage());
                System.out.println("Exception was processed. Program continues");
            }
            finally {
                System.out.println("Inside bloсk finally");
            }
            System.out.println("Go program....");
            System.out.println("-----------------");
        }

    }
    }
Əsas metodun nəticələri :
Inside method print: first step
Inside bloсk finally
Go program....
-----------------
Exception: s is null!
Exception was processed. Program continues
Inside bloсk finally
Go program....
-----------------
Inside method print: second step
Inside bloсk finally
Go program....
-----------------
Blok finallyadətən try blokunda açılmış axınları bağlamaq və ya resursları azad etmək üçün istifadə olunur. Bununla belə, proqram yazarkən bütün resursların bağlanmasını izləmək həmişə mümkün olmur. Həyatımızı asanlaşdırmaq üçün Java tərtibatçıları bizə try-with-resourcessınaq blokunda açılan resursları avtomatik bağlayan konstruksiya təklif etdilər. İlk nümunəmizi bu şəkildə yenidən yazmaq olar try-with-resources:
public String input() throws MyException {
    String s = null;
    try(BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
        s = reader.readLine();
   } catch (IOException e) {
       System.out.println(e.getMessage());
   }
    if (s.equals("")){
        throw new MyException ("String can not be empty!");
    }
    return s;
}
Java-nın imkanları sayəsində 7-ci versiyadan başlayaraq, biz eyni zamanda müxtəlif növ istisnaların tutulmasını bir blokda birləşdirərək kodu daha yığcam və oxunaqlı edə bilərik. Misal üçün:
public String input() {
    String s = null;
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
        s = reader.readLine();
        if (s.equals("")) {
            throw new MyException("String can not be empty!");
        }
    } catch (IOException | MyException e) {
        System.out.println(e.getMessage());
    }
    return s;
}

Nəticələr

Java-da istisnaların istifadəsi bizə “yedək” yollardan istifadə etməklə proqramın nasazlıqlara qarşı dözümlülüyünü artırmağa, tutma bloklarının istifadəsi ilə əsas kodun məntiqini istisnalarla işləmə kodundan ayırmağa imkan verir və həmçinin bizə həvalə etmək imkanı verir. atışlardan istifadə edərək kodun istifadəçisi üçün istisnaların idarə edilməsi.
Başqa nə oxumaq lazımdır:

Java-da İstisnalar haqqında Top 10 Sual

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION