JavaRush /Java Blogu /Random-AZ /Java-da istisnalar
Roman
Səviyyə

Java-da istisnalar

Qrupda dərc edilmişdir
"İstisnalar" mövzusu ilə rastlaşdığımda, hamısının necə işlədiyini ətraflı başa düşmək üçün İnternetin müxtəlif guşələrində cavab axtarmalı olduğum bir çox suallar yarandı. Nəticədə, mən öz izahatımı tərtib etdim, bu, bu fenomenlə yeni qarşılaşan yeni başlayanlar üçün daha başa düşülən ola bilər. Java-da istisnalar - 1Kompüterlərdə fasilə dərhal reaksiya tələb edən hadisənin baş verdiyi prosessora daxil olan siqnaldır. Kəsmə siqnalı prosessordan işləyən proqramı dayandırmağı tələb edir ki, onu bir qədər sonra davam etdirmək mümkün olsun, yəni kompüter proqramın icrası ilə bağlı bütün məlumatları yadda saxlamalıdır. Bu cür fasilələr ölümcül olmasa da, müvəqqəti xarakter daşıyır. Bu cür fasilələrə ya proqram kodu, ya da bəzi aparat funksionallığı səbəb ola bilər (məsələn, klaviaturada sadəcə düymələri basmaq; taymerlər, məsələn, kompüteri avtomatik söndürmək üçün). Kesintilərin sayı müəyyən bir prosessorun istehsalına qurulmuş müəyyən sayda məhdudlaşır, yəni bunun üçün xüsusi rabitə "kanalları" ayrılır və bütün digər prosesləri keçərək prosessora daxil olmağa imkan verir. İcraçı proqram kodunda xəta baş verdikdə (məsələn, sıfıra bölmə baş verdikdə) fasilələr də avtomatik olaraq yaradılır. Bu cür fasilələrə ənənəvi olaraq tələlər və ya istisnalar deyilir . Belə hallarda, "İstisna atıldı" demək adətdir, yəni İstisna işə salındı ​​və ya İstisna atıldı (atıldı), yəni kəsmə tələbi“nə etməli?” sualı ilə prosessora göndərilir. Bu anda prosessor dayandığı nöqtəni, daha doğrusu, məlumat icra edilməli olan növbəti xananın klasterini xatırlayaraq fəaliyyətini dayandırır. İcra edilmiş və yerinə yetirilməmiş təlimatların bütün zənciri xatırlanır. Bundan sonra prosessor belə bir xəta baş verdikdə hərəkət üçün yaddaşdan təlimatları oxuyur. Bu təlimata uyğun olaraq, müəyyən qruplara yeni dəyərlər daxil edə, bəzi hərəkət zəncirləri və ya yeni bir dövr əlavə edə bilər (məsələn, qayıtma və ya dönmə dövrü) və s., yəni əvvəllər qoyulmuş səhvdən asılı olaraq aşağı təlimatlar yerinə yetirilir. Kompüter sisteminin özündə müəyyən bir müddətdən sonra işə salınan bir çox avtomatik Kesintilər var, məsələn, kompüterdə işləyən prosesləri idarə etmək və ya qurulmuş həyəcan siqnallarını işə salmaq, daxil olan xarici siqnalları toplamaq və müxtəlif məlumat çeviriciləri. Yadda saxlamaq lazımdır ki, çox sayda kəsmə, bir sıra səbəblərə görə sistemi tamamilə "asmaq" edə bilər. Proqram kodundakı səhv avtomatik olaraq prosessorda fasiləyə səbəb olacaq və o, müəyyən edilmiş təlimatlara uyğun olaraq emal etməyə çalışacaq. Lakin bütün fasilələr onları idarə etmək üçün nəzərdə tutulmayıb və ya o, bizə uyğun olmayan prosedur yarada bilər, məsələn, o, sadəcə tətbiqi sıradan çıxaracaq. Buna görə də, proqramlaşdırmada, proqramçının potensial olaraq səhv ehtimalını gördüyü kodun müəyyən bir hissəsi üçün öz kəsilmənizi təşkil etmək mümkündür. Bu halda, səhv proqram daxilində işlənəcək və təlimatların işlənməsi üçün prosessorla əlaqə saxlamayacaq. Bu cür blokların tərifi "İstisna" Obyektinin yaradılması ilə təşkil edilir . Bu obyekt avtomatik olaraq blokda yaradılır try-catch. Blokda >tryxətanın olub-olmaması yoxlanılır və əgər varsa, proqram bloka gedir catch, burada xətanın qarşısını almaq və ya səviyyəni artırmaq üçün tədbirlər görülür. Məsələn, sonradan əlavə edilməli və çıxılmalı olan Nömrələri klaviaturadan daxil etsək , klaviaturadan Hərfləri daxil etmək onları Rəqəmlərlə əlavə etməyi qeyri-mümkün edəcək (gəlin bu iki dəyişənin cəmini S hərfi ilə işarə edək). Odur ki, komanda olaraq trytərkibində Rəqəmlər olan A rəqəminin hərfləri olan B nömrəsinə (yəni S = A + B) əlavə oluna biləcəyini yoxlamalıyıq və bu mümkün deyilsə və mümkün deyilsə, o zaman müəyyən tədbirlər görülməlidir ki, Səhvlər Baş vermədi və “nə etməli?” sualı ilə yeni bir kəsmə prosessora uçmasın. Proqramda İstisna yoxdursa, onun icrası prosessor tərəfindən dayandırılacaq. Bir İstisna varsa, o, komanda tərəfindən "tutulduğunda" try, idarəetmə alternativ bir həll təyin edə bilən əmrə keçir catch, məsələn, biz bu iki rəqəmi əlavə etməyəcəyik, lakin S = A təyin edirik.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* sətri “int r = 1;” xəta baş verdiyi və proqram işi birbaşa istisna işləyicisinə yönləndirdiyi üçün yerinə yetirilmir (tutmaq bloku*/ Beləliklə, İstisnaların olması problemi prosessor səviyyəsinə atmadan proqram daxilində həll etmək imkanıdır. Səhv aşkar edildikdə blokda avtomatik olaraq yaradılan “İstisna” obyekti tryxəta növünün dəyərini ehtiva edir. Gəlin bunu "Bizim İstisnamız" adlandıraq - xüsusi səhvimizin təsviri ilə xüsusi işimiz üçün. Java dilinin yaradıcıları əvvəlcədən tipik səhvlərin müəyyən siyahısını və onları düzəltmək üçün tipik variantları yaratmışlar, yəni java-da müəyyən bir İstisnalar kitabxanası var ki, biz baş vermiş xətanı idarə etmək üçün ona müraciət edə bilərik. emal kodunu özümüz yazmamalıyıq və buna görə də OurException çox güman ki, artıq kimsə təsvir edilmişdir, ona görə də sadəcə olaraq, uğursuzluğun baş verə biləcəyi kodu idarə etmək üçün proqramımıza bu istisnalardan hansının daxil ediləcəyini bilməliyik. Səhv etsək və kitabxanadan səhv İstisna seçsək , onda işləyici onu “tutmayacaq”, səhv proqram daxilində həllini tapmayacaq və sorğu prosessora göndəriləcək. Ancaq tənbəllər üçün bir yol var. Kitabxanadan bizə lazım olan istisnanın adını bilmiriksə, yuxarıda təsvir olunan nümunədə olduğu kimi “ İstisna ” adı ilə ümumi olanı götürə bilərik. Bu İstisna istənilən növ xətanı idarə etməyə qadirdir, lakin bizim qeyd edə biləcəyimiz hadisə haqqında konkret məlumat verə bilmir. Əvvəllər yazılmış İstisnalar kitabxanası yoxlanılmış və qeyd olunmamış İstisnalardan ibarətdir . Yoxlanılanlar proqramın işini dayandırmadan düzəldilə bilənlərdir, yəni mövcud olmayan bir qovluqda bir faylı açmağa çalışsaq, sistem bu barədə bizə məlumat verəcək, faylı buraxa bilərik. istədiyiniz qovluğa daxil edin və proqramı davam etdirin. Yəni, əslində, prosessora Interrupt sorğusu göndərildi , lakin sual olmadan: "bu problemlə bağlı nə edəcəyinizi axtarın?!?!" Biz özümüz aşkar etdiyimiz, prosessorun emal etdiyi və proqramı icra etməyə davam etdiyi hazır təlimatla bir Interrupt göndərdik. Yoxlanılmamış səhvlər düzəldilə bilməyəcək və proqram tamamlanmadan bağlanacaq, yəni prosessora kəsilmə sorğusu göndəriləcək., istənilən halda proqramın icrasını dayandıracaq. Proqramda bu cür istisnaları yazmağın yeganə məqamı istifadəçiyə nə baş verdiyini başa düşməkdir, çünki bu fasiləni tutaraq, proqramın qəzaya uğradığına görə ekranda məlumat mesajı göstərə bilərik. Bu cür fasilələri tutmağın ikinci səbəbi, onları sonrakı təhlillər üçün qeydlərdə qeyd etmək imkanıdır (siz hackləndiniz, amma heç olmasa harada olduğunu bilirsiniz). Bu cür kitabxanaların mövcudluğunun nəticəsi onların daxil edilməsini yadda saxlamaq ehtiyacıdır. (Kitabxanalarla birlikdə yoxlanılmış və qeyd olunmayan İstisnaların siyahısını, məsələn, burada tapa bilərsiniz ) Əgər hansı kitabxanaya daxil ediləcəyini dəqiq bilmiriksə və ya bir neçə səhv variantı varsa, catchtələb olunan İstisnaları bir neçəsində sadalaya bilərik. Siyahıda varsa, sistem özü düzgün işləyicini seçəcək. Müəyyən bir İstisna əvəzinə , əvvəlki bloklarda işlənilmədiyi təqdirdə hər hansı bir İstisna növünü idarə edə bilən ümumi “ İstisna ” yaza bilərsiniz .
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
Əgər blok varsa, tryavtomatik olaraq İstisna yaradılır. Əgər bir anda İstisna məcbur etmək lazımdırsa , o zaman əmr istifadə olunur throw. Yəni, biz müstəqil olaraq bir obyekt yaradırıq new throw... bundan sonra proqram öz işini dayandırır, prosessora kəsmə sorğusu göndərir və proqram bölməsinə köçürülür catch, oradan sonrakı hərəkətlər üçün təlimat almağa çalışır. Əl ilə İstisna yaratmaqla , kitabxanadan onun xüsusi növünü təyin edə bilərik:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
catchsonra işləyici bu xüsusi İstisna ilə bloku axtaracaq - proqram boyu hər tərəfdən axtarış catch. İstisna ilə işləmə əmrindən sonra throw, blokda olanlar istisna olmaqla, bütün qalan proqram kodu icra olunmayacaq catch. Proqramda işləyici tapılmırsa, prosessora sual verilir: “nə edəcəyinizə özünüz qərar verin” və o, proqramı dayandırır. Zəng new throw... həm blok daxilində, həm də kənarda edilə bilər >try(proqramın istənilən yerində)
try {
   /* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

İstisnalar haqqında bildiriş

Daha əvvəl kimsə tərəfindən yazılmış üsullara İstisnalar atmaq daxil ola bilər. Kodu yazan proqramçı sadəcə ehtiyatlı olmaq üçün sonrakı proqramçılara onun yazdığı metodda xəta ola biləcəyi barədə xəbərdarlıq etdi. Beləliklə, məsələn, aşağıda təsvir olunan fayl yaratma üsulu, fayl yaratarkən xətanın baş verə biləcəyini (verilmiş yolda fayl yoxdur) şərtləndirir, bu da səhv idarəçisinə ehtiyac olacağını bildirir:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Ancaq eyni zamanda, heç bir işləyicinin özü yoxdur, bu o deməkdir ki, indi biz proqramımızda yazılmış metodu normal rejimdə sadəcə çağıra bilməyəcəyik. İndi bir səhv idarəçisi yazmalıyıq və bu metodu blokda çağırmalıyıq try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

Doğma istisnalar

Mövcud kitabxanalar bizim üçün kifayət deyilsə, müəyyən səhvləri idarə etmək üçün öz istisnalarınızı yaza bilərsiniz. Bunun üçün sadəcə Exception sinfindən miras qalan sinif yaradırıq
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Öz istisnalarınızı yaratarkən iki qaydanı yadda saxlamalısınız:
  1. Sinifimizin adı "İstisna" ilə bitməlidir
  2. Sinifdə İstisna probleminin təfərrüatlarını təsvir edən sətir dəyişəni olan konstruktor olmalıdır. Konstruktorda super konstruktor çağırılır və mesaj ötürülür.
Yaradılmış istisnadan istifadə nümunəsi:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
Bu İstisnanı kodla tuturuq:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
Proqramın icrasının nəticəsi belə olacaq: StudentNotFoundException: ID 0000001 olan tələbəni tapmaq mümkün olmadı

Niyə İstisnalar yazmaq lazımdır?

1996-cı ildə Ariane 5 raketi float dəyişəninin tam dəyişənə düzgün çevrilməməsi səbəbindən qəzaya uğradı. Bu vəziyyət üçün heç bir istisna və ya idarəçi yox idi. Əgər faylı endirərkən İnternet bağlantısı kəsilirsə, İstisnanın olması əlaqə bərpa edildikdən sonra yükləməni davam etdirməyə imkan verəcəkdir. İstisna yoxdursa, yükləmə yenidən başlamalı olacaq.

İstinadlar:

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