Java-da tutmağa çalışın


JavaBaxılıb 49

Java istisnası, kodda gözlənilməz bir şərt icra etdikdə baş verir. Bu istisnanı müxtəlif yollarla həll edə bilərik. Bu təlimatda istisnaları idarə etmək üçün java-da try-catch-dan necə istifadə edəcəyimizi öyrənəcəyik.

Java sınamaq bloku

Java cəhd blok bir təyin etmək istisna ilə nəticələnə biləcək və ya gözlənilməz bir vəziyyət yarada biləcək ifadələr. Ya ola bilərik cəhd edin birləşmə və ya nəhayət birləşmə. Bağımsız ola bilmərik cəhd tək blok.

Java tutmaq blok istisnanı idarə etmək üçün ifadələr ehtiva edir. The tutmaq blok həmişə izləyir cəhd blok və müstəqil olaraq mövcud deyil. Tək bir sınaq ifadəsi ilə yanaşı bir çox istisnaları idarə etmək üçün birdən çox tutma ifadələrini də istifadə edə bilərik. Müvafiqini icra edir tutmaq meydana gələn istisna növünə uyğun blok cəhd blok.

Dəqiqləşdirmə sintaksisidir

try {
  //code that generates exception
}
catch(ExceptionType e) {
  //Handle the exception
}

Sonda sintaksis

try {
  //code that generates exception
}
finally {
//code that executes always
}

Java-da sınamaq nümunəsi

İndi javada sadə bir sınaqdan keçirmə nümunəsinə baxaq. Fərz edək ki, mövcud olmayan bir dizin indeks elementinə daxil olmağa çalışan bir metodumuz var. Əvvəlcə istisnanı işlətmədən kodu yerinə yetirməyə çalışacağıq. Bu halda, icra zamanı istifadəçinin başa düşə bilməyəcəyi bir istisna mesajı atır. Ayrıca, metod içərisindəki ikinci ifadəni icra etmir. Bu gözlənilməz vəziyyəti idarə etmək və qalan kod icrasına davam etmək üçün try-catch blokunu tətbiq edirik.

public class CheckArray {
  
  String[] lang = {"Java","C","C++"};
  
  public void getElement() {
    System.out.println("Index 4: " + lang[4]);
    System.out.println("Index 0: " + lang[0]);
  }

  public static void main(String[] args) {
    CheckArray c = new CheckArray();
    c.getElement();

  }

}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3
  at CheckArray.getElement(CheckArray.java:6)
  at CheckArray.main(CheckArray.java:11)

İndi, istisna vəziyyətini tətikləyən kodu blokun içərisinə qoyuruq və istisnanı tutma blokunda idarə edirik. Bu vəziyyətdə, göstərilən indeks olmadığından ArrayIndexOutOfBoundsException atır. İstisna try-catch istifadə edildiyi üçün, try blokundan sonra ikinci ifadəni icra edir.

public class CheckArray {
  
  String[] lang = {"Java","C","C++"};
  
  public void getElement() {
    try {
      System.out.println("Index 4: " + lang[4]);
      
    }
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Exception: The specified index does not exist");
    }
    System.out.println("Index 0: " + lang[0]);	
  }

  public static void main(String[] args) {
    CheckArray c = new CheckArray();
    c.getElement();

  }

}
Exception: The specified index does not exist
Index 0: Java

Birdən çox tutma bloku

Bir mahnı oxumaq blokunda bir çox istisnaları idarə etmək üçün birdən çox tutma bloku ola bilər. Tək bir metodun birdən çox gözlənilməz şərtlər yarada biləcəyi vəziyyətlər ola bilər. Bu vəziyyətdə, müvafiq istisnaları idarə etmək üçün fərqli tutma bloklarımız olmalıdır. Try blokunda istehsal olunan istisna növünə əsasən, müvafiq tutma istisnası ifadəsini icra edir.

Əgər istisna yoxdursa cəhd kod, daha sonra heç birini icra etmir tutmaq ifadələr, yəni bütün tutma bloklarını görməməzlikdən gəlir və normal proqram icrası ilə davam edir.

sintaksis

try {
  //code that generates exception
}
catch(ExceptionType1 e) {
  //Handle exception
}
catch(ExceptionType2 e) {
  //Handle exception
}

misal

İndi çoxu tutmağın bir nümunəsini görək istisnalar java-da try-catch istifadə edin. Burada bir ədədi 0-a bölməyə çalışırıq. Buna görə yaradır Aritemtik İstisna və bununla da ilk tutma blokunu həyata keçirir.

public class MultipleCatchDemo {

  int num[] = new int[3];
  
  public void checkException() {
    try {
      num[0] = 10;
      num[1] = 0;
      int result = num[0]/num[1];
      System.out.println(result);
    }
    catch(ArithmeticException e) {
      System.out.println("Exception: Divide by 0 not allowed");
    }
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Exception: Specified index is not present");
    }
    
  }
  public static void main(String[] args) {
    MultipleCatchDemo m = new MultipleCatchDemo();
    m.checkException();

  }

}
Exception: Divide by 0 not allowed

İndi fərz edək ki, kodu dəyişdiririk və bunun üçün bir an əldə etməyə çalışdığımız fərqli bir istisna yaradır array indeksi olmayan element. Bu vəziyyətdə yaradır ArrayIndexOutOfBoundsException və ikincisini icra edir tutmaq blok. Həqiqi bir ssenaridə, hər dəfə gözlənilməz şərtlərə görə fərqli istisnaların baş verə biləcəyi bir kodu əldə edə bilərik. Beləliklə, gözləməyimizi gözlədiyimiz bütün istisnaları idarə etmək həmişə daha yaxşıdır.

public class MultipleCatchDemo {

  int num[] = new int[3];
  
  public void checkException() {
    try {
      num[0] = 10;
      num[10] = 5;
      int result = num[0]/num[10];
      System.out.println(result);
    }
    catch(ArithmeticException e) {
      System.out.println("Exception: Divide by 0 not allowed");
    }
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Exception: Specified index is not present");
    }
    
  }
  public static void main(String[] args) {
    MultipleCatchDemo m = new MultipleCatchDemo();
    m.checkException();

  }

}
Exception: Specified index is not present

Tutaq ki, kod hər hansı bir istisna yaratmır, sonra bütün tutma ifadələrini görməzdən gəlir.

public class MultipleCatchDemo {

  int num[] = new int[3];
  
  public void checkException() {
    try {
      num[0] = 10;
      num[1] = 5;
      int result = num[0]/num[1];
      System.out.println(result);
    }
    catch(ArithmeticException e) {
      System.out.println("Exception: Divide by 0 not allowed");
    }
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Exception: Specified index is not present");
    }
    
  }
  public static void main(String[] args) {
    MultipleCatchDemo m = new MultipleCatchDemo();
    m.checkException();

  }

}
2

Tək bir cəhd blokunda bir çox istisnaların idarə edilməsi

Tək bir cəhd blokunda bir çox istisnaları idarə etmək seçimimiz var. Bunun üçün istifadə edirik | (OR) operatoru.

sintaksis

try {
  //code
}
catch(ExceptionType1 | ExceptionType2 e) {
  //Handle the exception
}

misal

Yuxarıda gördüyümüz eyni nümunədən istifadə edək. Bu işin yeganə dezavantajı, hər iki istisna növünü eyni tutma blokunda idarə etdiyimiz üçün xüsusi mesajlar yarada bilməməyimizdir. Aşağıdakı nümunədə metodu istifadə edərək sistem tərəfindən yaradılan bir mesaj istifadə edirik getMessage Bu Atılan sinif.

public class MultipleCatchDemo {

  int num[] = new int[3];
  
  public void checkException() {
    try {
      num[0] = 10;
      num[10] = 5;
      int result = num[0]/num[1];
      System.out.println(result);
    }
    catch(ArithmeticException  | ArrayIndexOutOfBoundsException e) {
      System.out.println("Exception: " + e.getMessage());
    }
    
  }
  public static void main(String[] args) {
    MultipleCatchDemo m = new MultipleCatchDemo();
    m.checkException();

  }

}
Exception: Index 10 out of bounds for length 3

Try-catch istifadə edərək ümumi istisnadan istifadə

Müəyyən bir istisna növü ilə işləmək istəmədikdə, try-catch istifadə edərək hər cür istisnaları idarə edən ümumi istisnadan istifadə edə bilərik. Bir İstisna bütün istisna növlərinin əsas sinifidir. Buna görə kod hər hansı bir gözlənilməz şərtlə qarşılaşırsa, müəyyən bir istisna olmadıqda bu istisnanı həyata keçirir.

sintaksis

try {
  //code
}
catch(Exception e) {
  //Handle the exception
}

Try-catch istifadə edərək ümumi istisnanın nümunəsi

Aşağıdakı nümunədə, tək bir sınaqdan çıxarmaq üçün ümumi bir istisna var. Bu, meydana gələn hər hansı bir istisna növünü idarə edir.

public class MultipleCatchDemo {

  int num[] = new int[3];
  
  public void checkException() {
    try {
      num[0] = 10;
      num[10] = 5;
      int result = num[0]/num[1];
      System.out.println(result);
    }
    catch(Exception e) {
      System.out.println("Exception: " + e.getMessage());
    }
  }
  public static void main(String[] args) {
    MultipleCatchDemo m = new MultipleCatchDemo();
    m.checkException();

  }

}
Exception: Index 10 out of bounds for length 3

Bu, ümumi istisnanın digər istisna növlərindən heç birinin try-catch blokunda uyğun gəlmədiyi zaman həyata keçirdiyi başqa bir nümunədir. Cəhd blokunda səhv formatı Integer-ə təhlil edərək bir NumberFormatException şərti yaradırıq. Bu istisna növünü idarə etmədiyimiz üçün ümumi bloku icra edir və sistem tərəfindən yaradılan səhv mesajını yazdırır.

public class MultipleCatchDemo {

  int num[] = new int[3];
  
  public void checkException() {
    try {
      num[0] = 10;
      num[1] = Integer.parseInt("5 "); //exception code
      int result = num[0]/num[1];
      System.out.println(result);
    }
    
    catch(ArithmeticException e) {
      System.out.println("Exception: Divide by 0 not allowed");
    }
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Exception: Specified index is not present");
    }
    catch(Exception e) {
      System.out.println("Exception: " + e.getMessage());
    }
    
  }
  public static void main(String[] args) {
    MultipleCatchDemo m = new MultipleCatchDemo();
    m.checkException();

  }

}
Exception: For input string: "5 "

İstehsal qaydasını try-catch istifadə edərək tutmaq

İndi try-catch istifadə edərək fərqli istisna növlərini və ümumi istisnaları gördük, bundan sonra ümumi bir mövcud olduqda istisnaları tutma qaydasını başa düşməliyik. Bir çox tutma bloku olduqda, ümumi istisna növünü son tutma bloku kimi istifadə etməyi həmişə unutmamalıyıq. Bunun səbəbi, digər sub istisna növləri əlçatmaz olduğundan ilk olaraq istifadə etsək, tərtib səhvini atacaqdır. The İstisna sinif bütün digər istisna növlərinin üst sinifidir.

İstirahət qaydasına baxın

Aşağıdakı nümunədə ilk tutma blokunda ümumi istisna növündən istifadə etdiyimiz üçün tərtib səhvini alırıq. Bunun səbəbi digər istisnaların əlçatmaz olmasıdır.

public class MultipleCatchDemo {

  int num[] = new int[3];
  
  public void checkException() {
    try {
      num[0] = 10;
      num[1] = Integer.parseInt("5 ");
      int result = num[0]/num[1];
      System.out.println(result);
    }
    catch(Exception e) {
      System.out.println("Exception: " + e.getMessage());
    }
    catch(ArithmeticException e) {
      System.out.println("Exception: Divide by 0 not allowed");
    }
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Exception: Specified index is not present");
    }
    
  }
  public static void main(String[] args) {
    MultipleCatchDemo m = new MultipleCatchDemo();
    m.checkException();

  }

}
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
  Unreachable catch block for ArithmeticException. It is already handled by the catch block for Exception
  Unreachable catch block for ArrayIndexOutOfBoundsException. It is already handled by the catch block for Exception

  at MultipleCatchDemo.checkException(MultipleCatchDemo.java:15)
  at MultipleCatchDemo.main(MultipleCatchDemo.java:29)

nəhayət cəhd edin

ilə yanaşı, cəhd edin blok, a daxil edə bilərik finally sonuna doğru blok. İstisnanın olub-olmamasından asılı olmayaraq, içindəki kodu yerinə yetirir finally blok. Bu normalda başlanğıcda yaratdığımız bir obyekti bağlamaq üçün istifadə olunur. Məsələn, FileReader obyektinin bağlanması və s.

Misal: istisna olmadıqda

Aşağıdakı nümunədə, olduğunu görə bilərik finally blokda yaradılan bir istisna olmadıqda belə icra olunur cəhd edin blok.

public class FinallyDemo{
  
  int a = 10;
  int b = 2;
  public void divide() {
    try {
      int result = a/b;
      System.out.println("Result: " + result);
    }
    catch(ArithmeticException e) {
      System.out.println("Exception: Division by 0 is not allowed");
    }
    finally {
      System.out.println("Divide method executed");	
    }
    
  }

  public static void main(String[] args) {
    FinallyDemo f = new FinallyDemo();
    f.divide();

  }

}
Result: 5
Divide method executed

Misal: İstisna olduqda

Aşağıda finally bir istisna baş verdikdə və bir cəhd blokunda işləndikdə blok.

public class FinallyDemo{
  
  int a = 10;
  int b = 0;
  public void divide() {
    try {
      int result = a/b;
      System.out.println("Result: " + result);
    }
    catch(ArithmeticException e) {
      System.out.println("Exception: Division by 0 is not allowed");
    }
    finally {
      System.out.println("Divide method executed");	
    }
    
  }

  public static void main(String[] args) {
    FinallyDemo f = new FinallyDemo();
    f.divide();

  }

}
Exception: Division by 0 is not allowed
Divide method executed

Nəhayət, cəhd edin

Aşağıdakı axın cədvəli, nəhayət, cəhd edin ifadələrinin iş axınını aydın şəkildə başa düşməyimizə kömək edəcək.

Java-da tutmağa çalışınPin

İçəriyə girməyə cəhd edən blok

Başqa bir sınaqdan keçirmə bloku içərisində bir sınaqdan keçirmə bloku olduqda, ona içəri girməli bir blok deyirik. Daxili cəhd blokunun içərisində bir istisna meydana gəldikdə, əvvəlcə daxili tutma bloku tərəfindən işləndiyini yoxlayır. Əgər işlənmirsə, idarəetmə valideyn tutma blokuna keçir və istisnanı yoxlayır. Varsa, ana tutma blokunu həyata keçirir.

sintaksis

//Main try block
try {
   //code
   //Inner try block
   try {
   //code
   }
   //Inner catch block
   catch(Exception1 e) {
   //Handle exception
   }
//Main catch block
catch(Exception2 e) {
//Handle exception
}

Yerləşdirilmiş sınaqdan keçirilmiş blokun işlənməsi

javada tutmağa çalışınPin

Yerləşdirilmiş sınamaq nümunəsi

Bu nümunədə 2 cəhd bloku var. İlk cəhd bloku istisna yaratmır, ikinci cəhd isə ArithemticException yaradır. Valideyn tutma blokunda ArithmeticException işləyir, uşaq tutma blok ArrayIndexOutOfBoundsException. İndi icra zamanı, ikinci cəhd blokunu icra etdikdə, istisnanın uyğun tutmada işlədiyini yoxlayır. Lazımi növü ehtiva etmədiyi üçün, istisna növünə uyğun olan üst tutma blokunu yoxlayır və eyni şəkildə həyata keçirir.

public class NestedDemo {

  public static void main(String[] args) {
    int a = 10;
    int b = 5;
    
    try {
      int result = a/b;
      System.out.println("Result: " + result);
      try {
        b = 0;
        result = a/b;
        System.out.println("Result: " + result);
      }
      catch(ArrayIndexOutOfBoundsException e) {
        System.out.println("Exception: " + e.getMessage());
      }
    }
    catch(ArithmeticException e) {
      System.out.println("Exception: " + e.getMessage());
    }
  }

}
Result: 2
Exception: / by zero

İndi hər ikisinin olduğu başqa bir nümunəyə baxaq cəhd ifadələr bir istisna gətirir. Bu vəziyyətdə, birincisini icra edərkən cəhd blok, qarşılaşır a NumberFormatException və müvafiq əsas işləyir tutmaq blok. Valideyndən bəri cəhd blok bir istisna ehtiva edir, daxili işləmir cəhd blok. Çap etməməsinin səbəbi budur Arifmetik İstisna daxili cəhd blokunun ifadəsi.

public class NestedDemo {

  public static void main(String[] args) {
    int a = 10;
    int b = 5;
    
    try {
      int result = Integer.parseInt(null);
      System.out.println("Result: " + result);
      try {
        b = 0;
        result = a/b;
        System.out.println("Result: " + result);
      }
      catch(ArithmeticException e) {
        System.out.println("Exception: Arithmetic Exception");
      }
    }
    catch(NumberFormatException e) {
      System.out.println("Exception: Number format exception");
    }
    System.out.println("End of method");
  }

}
Exception: Number format exception
End of method

 

arayış

Şərh yaz

Translate »
1