İstisnalar və ya müstəsna hallar (hallar) proqramın işləməsi zamanı baş verən səhvlərdir. Java-da bütün istisnalar obyektlərdir. Buna görə də, onlar yalnız müstəsna vəziyyət yarandıqda avtomatik olaraq deyil, həm də tərtibatçının özü tərəfindən yaradıla bilər. İstisna siniflərinin iyerarxiyası: İstisnalar bir neçə sinfə bölünür, lakin onların hamısının ortaq əcdadı var - sinif
Throwable
. Onun törəmələri alt siniflər Exception
və Error
. İstisnalar ( Exceptions
) proqramda, prinsipcə, həll edilə bilən və proqnozlaşdırıla bilən problemlərin nəticəsidir. Məsələn, tam ədədlərdə sıfıra bölünmə baş verdi. Səhvlər ( Errors
) daha ciddi problemlərdir ki, Java spesifikasiyası JVM səviyyəli problemlərdir, çünki siz öz proqramınızda idarə etməyə çalışmamalısınız. Məsələn, bu cür istisnalar virtual maşın üçün mövcud yaddaş tükəndikdə baş verir. Proqram hələ də JVM üçün əlavə yaddaş təmin edə bilməyəcək. Java-da bütün istisnalar üç növə bölünür: yoxlanılmış istisnalar ( checked
) və yoxlanılmamış istisnalar ( unchecked
) səhvlər ( Errors
) və işləmə vaxtı istisnaları ( RuntimeExceptions
sinif nəsli Exception
). Nəzarət olunan istisnalar proqramda idarə oluna bilən və edilməli olan xətalardır; sinfin bütün nəsli Exception
(lakin RuntimeException
) bu tipə aiddir. İstisna ilə işləmə operatorlar vasitəsilə həyata keçirilə try…catch
və ya proqramın xarici hissəsinə köçürülə bilər. Məsələn, bir metod özü idarə etmədən çağırış iyerarxiyasında yuxarıda baş verən istisnaları keçə bilər. Yoxlanılmamış istisnalar işləməyi tələb etmir, lakin siz istəsəniz sinif istisnalarını idarə edə bilərsiniz RuntimeException
. Aşağıdakı proqramı tərtib edib işləyək:
class Main {
public static void main(String[] args) {
int a = 4;
System.out.println(a/0);
}
}
Başladıqdan sonra konsolda aşağıdakı mesaj görünəcək:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:4)
Mesaj baş verən istisnanın sinfini göstərir - ArithmeticException
. Bu istisna idarə edilə bilər:
class Main {
public static void main(String[] args) {
int a = 4;
try {
System.out.println(a/0);
} catch (ArithmeticException e) {
System.out.println("Произошла недопустимая арифметическая операция");
}
}
}
İndi standart bir səhv mesajı əvəzinə, parametri istisnaya uyğun gələn sinifin e obyekti olan bir blok yerinə yetiriləcək catch
(obyektin özünə hər hansı bir ad verilə bilər, zorla atmaq istəsək lazım olacaq. bu istisna yenidən, məsələn, başqa bir işləyici yoxlanılır). Bu halda, blok try
istisnanın potensial olaraq baş verə biləcəyi proqram fraqmentini ehtiva edir. try
Müxtəlif istisna sinifləri ilə bir neçə tutma blokuna uyğun ola bilər .
import java.util.Scanner;
class Main {
public static void main(String[] args) {
int[] m = {-1,0,1};
Scanner sc = new Scanner(System.in);
try {
int a = sc.nextInt();
m[a] = 4/a;
System.out.println(m[a]);
} catch (ArithmeticException e) {
System.out.println("Произошла недопустимая арифметическая операция");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Обращение по недопустимому индексу массива");
}
}
}
Əgər təqdim olunan proqramı işə saldıqdan sonra istifadəçi 1 və ya 2-ci klaviaturadan daxil olarsa, proqram heç bir istisna yaratmadan işləyəcək. İstifadəçi 0-a daxil olarsa, sinif istisnası baş verəcək ArithmeticException
və birinci blok tərəfindən idarə olunacaq catch
. İstifadəçi 3-ə daxil olarsa, sinif istisnası baş verəcək ArrayIndexOutOfBoundsException
(massiv sərhəddən kənarda) və o, ikinci blok tərəfindən işlənəcək catch
. Əgər istifadəçi tam olmayan nömrə daxil edərsə, məsələn, 3.14, onda bir sinif istisnası baş verəcək InputMismatchException
(giriş növü uyğunsuzluğu) və biz bunu heç bir şəkildə idarə etmədiyimiz üçün standart səhv formatında atılacaq. Bununla belə, siz sinif üçün işləyici əlavə edə bilərsiniz Exception
, çünki bu sinif bütün digər yoxlanılan istisnalar üçün əsas sinifdir, o, onlardan hər hansı birini (o cümlədən ) tutacaq InputMismatchException
.
import java.util.Scanner;
class Main {
public static void main(String[] args) {
int[] m = {-1,0,1};
int a = 1;
Scanner sc = new Scanner(System.in);
try {
a = sc.nextInt();
m[a-1] = 4/a;
System.out.println(m[a]);
} catch (ArithmeticException e) {
System.out.println("Произошла недопустимая арифметическая операция");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Обращение по недопустимому индексу массива");
} catch (Exception e) {
System.out.println("Произошло ещё Howое-то исключение");
}
}
}
İstisnalar siniflər və alt siniflər iyerarxiyası üzərində qurulduğundan, əvvəlcə daha konkret istisnaları, sonra isə daha ümumi olanları idarə etməyə çalışmalısınız. Yəni, əgər biz bloku sinif istisnası ilə işləmə ilə birinci (üçüncü deyil) yerləşdirsək Exception
, biz heç vaxt “Başqa bir istisna baş verdi”dən başqa heç bir səhv mesajı görməzdik (bütün istisnalar bu blok tərəfindən dərhal tutulacaq və ona çatmayacaqdır. istirahət). Bloklara əlavə try…catch
bir blok ola bilər finally
. İstisnanın baş verib-verməməsindən asılı olmayaraq, ona yerləşdirilən əmrlər istənilən halda yerinə yetiriləcək. Baxmayaraq ki, idarə olunmayan bir istisna baş verdikdə, bu istisnanın yaradılmasından sonra proqramın qalan hissəsi yerinə yetirilmir. Məsələn, bəzi uzun hesablamalar zamanı istisna baş veribsə, finally
siz aralıq nəticələri blokda göstərə və ya saxlaya bilərsiniz. Mənbəyə keçid: İstisnalar və onların idarə edilməsi
GO TO FULL VERSION