CodeGym /Java Blogu /Rastgele /İstisnalar: işaretli, işaretsiz ve özel
John Squirrels
Seviye
San Francisco

İstisnalar: işaretli, işaretsiz ve özel

grupta yayınlandı
MERHABA! Geçen derste Java dilindeki istisnalarla tanıştık ve onlarla nasıl çalışılacağına dair örnekler gördük. Bugün istisnaların yapısına daha derinlemesine bakacağız ve kendi istisnalarımızı nasıl yazacağımızı öğreneceğiz :)

İstisna türleri

Daha önce de söylediğimiz gibi, Java'da neredeyse 400 tane istisna var! Ancak hepsi gruplara ayrılmıştır, bu yüzden onları hatırlamak oldukça kolaydır. Görünüşü şu şekildedir: İstisnalar: işaretli, işaretsiz ve özel - 2 Tüm istisnaların sınıfta ortak bir ataları vardır Throwable. Ondan iki ana grup türetilmiştir: istisnalar ( Exception ) ve hatalar ( Error ). Hata - Bu, Java sanal makinesinin çalışmasıyla ilgili kritik bir çalışma zamanı hatasını temsil eder. Çoğu durumda, koddaki bazı ciddi kusurları gösterdiğinden Hata'nın ele alınmasına gerek yoktur. Bunların en ünlüsü StackOverflowError (bu, örneğin bir yöntem kendisini sonsuza kadar çağırdığında meydana gelir) ve OutOfMemoryError'dur .(bu, yeni nesneler oluşturmak için yeterli bellek olmadığında gerçekleşir). Gördüğünüz gibi, bu durumlarda, genellikle çalışma zamanında halledilecek hiçbir şey yoktur: kod sadece yanlış yazılmıştır ve üzerinde yeniden çalışılması gerekir. İstisna - Bu, bir istisnayı temsil eder: program çalışırken meydana gelen istisnai, planlanmamış bir durum. Hata kadar ciddi değiller ama yine de dikkatimizi çekmeleri gerekiyor. Tüm istisnalar 2 türe ayrılır: işaretli ve işaretsiz . İstisnalar: işaretli, işaretsiz ve özel - 3 Kontrol edilen tüm istisnalar sınıftan türetilir Exception. "Kontrol edildi" ne anlama geliyor? Geçen derste bundan bahsetmiştik: "Bu nedenle Java derleyicisi en yaygın istisnaları ve bunların oluşabileceği durumları bilir." Örneğin, kod bir dosyadan veri okursa, dosyanın kolayca var olamayacağını bilir. Ve bu tür pek çok durum var (ki bu çıkarım yapabilir). Buna göre derleyici, bu potansiyel istisnaların varlığı için kodumuzu önceden kontrol eder. Onları bulursa, biz onları işleyene veya yeniden atana kadar kodu derlemeyecektir. İkinci istisna türü "işaretlenmemiş" tir. Sınıftan türetilirler RuntimeException. Kontrol edilen istisnalardan nasıl farklıdırlar? Görünüşe göre türetilmiş birçok farklı sınıf var.RuntimeException(çalışma zamanı istisnalarını açıklayan). Aradaki fark, derleyicinin bu hataları öngörmemesidir. "Kod yazılırken şüpheli bir şey bulamadım ama çalışırken bir şeyler ters gitti. Görünüşe göre kodda hatalar var!" Ve aslında bu doğrudur. Denetlenmeyen istisnalar çoğunlukla programcı hatalarının sonucudur. Ve derleyici açıkça, insanların kendi elleriyle yaratabilecekleri olası her türlü kötü durumu önceden göremez. :) Bu nedenle, kodumuzda bu tür istisnaların işlenip işlenmediğini kontrol etmez. Zaten birkaç denetlenmemiş istisna ile karşılaştınız:
  • Sıfıra bölünürken bir ArithmeticException oluşur
  • Dizinin dışında bir konuma erişmeye çalıştığınızda bir ArrayIndexOutOfBoundsException oluşur.
Elbette, Java'nın yaratıcılarının zorunlu istisna işlemeyi getirmiş olabileceğini hayal edebilirsiniz, ancak bu durumda kod çok karmaşık olacaktır. try-catchHerhangi bir bölme işlemi için, yanlışlıkla sıfıra bölüp bölmediğinizi kontrol etmek için bir blok yazmanız gerekir mi ? try-catchBir diziye her eriştiğinizde, dizininizin sınırların dışında olup olmadığını kontrol etmek için bir blok yazmanız gerekir . Her şey spagetti kodu olurdu ve tamamen okunamaz olurdu. Bu fikirden vazgeçilmiş olması mantıklı. try-catchSonuç olarak, denetlenmeyen özel durumların bloklar halinde ele alınması veya yeniden atılması gerekmez (ancak bu, Hata durumunda olduğu gibi teknik olarak mümkündür).

Kendi istisnanızı nasıl atabilirsiniz?

Elbette Java'nın yaratıcıları, programlarda ortaya çıkabilecek her istisnai durumu önceden göremezler. Dünyada çok fazla program var ve bunlar çok çeşitli. Ancak bu endişelenecek bir şey değil çünkü gerekirse kendi istisnanızı oluşturabilirsiniz. Bunu yapmak çok kolay. Tek yapmanız gereken kendi sınıfınızı oluşturmak. Adının "İstisna" ile bittiğinden emin olmalısınız. Derleyici buna ihtiyaç duymaz, ancak kodunuzu okuyan diğer programcılar bunun bir istisna sınıfı olduğunu hemen anlayacaktır. Ek olarak, sınıfın sınıftan miras alındığını belirtin Exception(derleyici bunu gerektirir). Örneğin bir Dogsınıfımız olduğunu varsayalım. kullanarak köpeği gezdirebiliriz.walk()yöntem. Ancak bunu yapmadan önce evcil hayvanımızın tasma, tasma ve ağızlık takıp takmadığını kontrol etmeliyiz. Bu donanımlardan herhangi biri eksikse, kendi istisnamızı atarız: DogIsNotReadyException . Kodu şöyle görünür:

public class DogIsNotReadyException extends Exception {

   public DogIsNotReadyException(String message) {
       super(message);
   }
}
Sınıfın bir istisna olduğunu belirtmek için, sınıf adından sonra " extentions Exception " yazmanız gerekir (bu, "sınıfın İstisna sınıfından türetildiği" anlamına gelir). Yapıcıda, basitçe Exceptionsınıf yapıcısını String mesajıyla çağırırız (istisna meydana gelirse, kullanıcıya hatanın açıklamasını, mesajı gösteririz). Sınıf kodumuzda bunun nasıl göründüğü aşağıda açıklanmıştır:

public class Dog {

   String name;
   boolean isCollarPutOn;
   boolean isLeashPutOn;
   boolean isMuzzlePutOn;


   public Dog(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

   }

   public void putCollar() {

       System.out.println("The collar is on!");
       this.isCollarPutOn = true;
   }

   public void putLeash() {

       System.out.println("The leash is on!");
       this.isLeashPutOn = true;
   }

   public void putMuzzle() {
       System.out.println("The muzzle is on!");
       this.isMuzzlePutOn = true;
   }

   public void walk() throws DogIsNotReadyException {

   System.out.println("We're getting ready for a walk!");
   if (isCollarPutOn && isLeashPutOn && isMuzzlePutOn) {
       System.out.println("Hooray, let's go for a walk! " + name + " is very happy!");
   } else {
       throw new DogIsNotReadyException(name + " is not ready for a walk! Check the gear!");
   }
 }

}
Şimdi yöntemimiz bir DogIsNotReadyExceptionwalk() fırlatıyor . Bu, throw anahtar sözcüğü ile yapılır. Daha önce de söylediğimiz gibi, istisna bir nesnedir. Bu nedenle, yöntemimizde bir istisna oluştuğunda (köpek bir şeyi kaçırıyor), yeni bir nesne yaratır ve bunu throw anahtar sözcüğünü kullanarak fırlatırız. Yöntem bildirimine " throws DogIsNotReadyException " ifadesini ekliyoruz . Başka bir deyişle, derleyici artık yöntemi çağırmanın istisnai bir duruma dönüşebileceğinin farkındadır. Buna göre, bu yöntemi programımızda bir yerde çağırırsak, bu istisnanın ele alınması gerekir. Bunu yöntemde yapmayı deneyelim : DogIsNotReadyExceptionwalk()main()

public static void main(String[] args) {
  
   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   dog.walk();// Unhandled exception: DogIsNotReadyException
}
Bu derlenmeyecek. İstisna ele alınmadı! try-catchİstisnayı işlemek için kodumuzu bir bloğa sarıyoruz :

public static void main(String[] args) {

   Dog dog = new Dog("Buddy");
   dog.putCollar();
   dog.putMuzzle();
   try {
       dog.walk();
   } catch (DogIsNotReadyException e) {
       System.out.println(e.getMessage());
       System.out.println("Checking the gear! Is the collar on? " + dog.isCollarPutOn + "\r\n Is the leash on? "
       + dog.isLeashPutOn + "\r\n Is the muzzle on? " + dog.isMuzzlePutOn);
   }
}
Şimdi konsol çıktısına bakalım: Tasma takılı! Namlu açık! Yürüyüşe hazırlanıyoruz! Buddy yürüyüşe hazır değil! Teçhizatı kontrol edin! Vites kontrol ediliyor! Yaka takılı mı? true Tasma takılı mı? false Namlu takılı mı? true Konsol çıktısının ne kadar bilgilendirici olduğuna bir bakın! Programda atılan her adımı görüyoruz; hatanın nerede oluştuğunu görüyoruz ve köpeğimizin tam olarak neyi kaçırdığını da anında görebiliyoruz. :) Ve kendi istisnalarınızı bu şekilde yaratırsınız. Gördüğünüz gibi, bu konuda karmaşık bir şey yok. Ve Java'nın yaratıcıları, yetersiz donanıma sahip köpekler için dile özel bir istisna ekleme zahmetine katlanmasalar da, onların gözden kaçmasını düzelttik. :)
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION