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 :)
Tüm istisnaların sınıfta ortak bir ataları vardır
Kontrol edilen tüm istisnalar sınıftan türetilir
İ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:
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 . 
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.
try-catch
Herhangi 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-catch
Bir 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-catch
Sonuç 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ı belirtinException
(derleyici bunu gerektirir). Örneğin bir Dog
sı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 Exception
sı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 : DogIsNotReadyException
walk()
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. :)
Daha fazla okuma: |
---|
GO TO FULL VERSION