1. İstisnalar
>
Sonunda, programcılar hata işlemeyi standartlaştırmayı ve otomatikleştirmeyi düşündüler. Bu, istisnalar icat edildiğinde oldu . İstisna mekanizması artık istisnai durumların %80'ini yönetiyor.
Bazı akademisyenler istisnalarla geldiyse, bu muhtemelen onun doktora tezinin konusuydu. Bunu bir programcı bulduysa, o zaman bir iş arkadaşından sırtına dostça bir şaplak almış olabilir: "İyi görünüyor, kardeşim."
Bir Java programında bölme işlemi gibi bir hata oluştuğunda 0
bazı harika şeyler olur:
Adım bir
Oluşan hata hakkında bilgi içeren özel bir istisna nesnesi oluşturulur.
Java'da her şey bir nesnedir ve istisnalar istisna değildir 🙂 İstisna nesnelerinin kendi sınıfları vardır ve onları sıradan sınıflardan ayıran tek şey sınıfı miras almalarıdır Throwable
.
İkinci adım
İstisna nesnesi "atılır". Belki buradaki ifade daha iyi olabilirdi. "İstisna atmak" daha çok bir yangın alarmını tetiklemeye veya bir "DEFCON 1" uyarısı vermeye benzer.
Java makinesine bir istisna atıldığında programın normal çalışması durur ve "acil durum protokolleri" başlar.
Adım üç
İstisnanın atıldığı yöntemden hemen çıkılır. İstisna, yine hemen çıkan çağıran yönteme iletilir. Ve böylece yöntem çıkana kadar zincir boyunca devam eder main
. Yöntem main
sona erdiğinde, program da sona erer.
Örnek:
kod | Konsol çıkışı |
---|---|
|
|
20. satırda bir istisna oluşur: 0'a bölme. Java makinesi hemen bir istisna oluşturur - bir ArithmeticException
nesne ve onu yönteme "fırlatır".
Yöntem divide()
hemen sona erer, bu nedenle şu dizeyi asla görmeyiz: Korkunç bir şey olmadı: 0. Program yönteme geri döner endTheWorld()
ve durum kendini tekrar eder: sistemde işlenmeyen bir istisna vardır, bu da yöntemin endTheWorld()
de anormal şekilde sonlandığı anlamına gelir. Ardından main
yöntem sonlandırılır ve program durur.
Bu istisnaların amacı nedir? Belirli istisna türlerini yakalamak için kendi kodunuzu yazabilir ve istisnai durumlarla başa çıkmak için kendi mantığınızı yazabilirsiniz.
2. İstisnaları yakalamak:try-catch
Java, yöntemlerin bu anormal şekilde sonlandırılmasını durdurmanıza izin veren bir istisna yakalama mekanizmasına sahiptir. Şuna benziyor:
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
Bu yapıya blok denir try-catch
.
İstisnaların meydana gelebileceği kod , kelimeden önce kaşlı ayraçlar içine alınır try
.
Kıvrımlı parantezlerden sonra, catch
anahtar kelimemiz ve parantezler içinde bir istisna değişkeni bildirimimiz var . Bunu , belirtilen türden bir istisna meydana gelirse yürütülecek kodu saran kaşlı ayraçlar izler .
" Birincil kodun " yürütülmesi sırasında herhangi bir istisna atılmazsa , catch bloğu içindeki kod yürütülmeyecektir. Bir istisna meydana gelirse, o zaman olacaktır (atılan istisnanın tipi parantez içindeki değişkenin tipiyle aynıysa).
Örnek:
kod | Konsol çıkışı |
---|---|
|
|
3. Çoklu catch
bloklar
Teorik olarak, her türlü istisna bir kod bloğuna atılabilir. Bazılarını bir şekilde halletmek isteyeceksiniz, diğerlerini başka bir şekilde ve yine bazılarını hiç halletmemeye karar vereceksiniz.
catch
Java geliştiricileri size yardım etmeye ve bloktan sonra bir değil birçok blok yazmanıza izin vermeye karar verdi try
.
try
{
// Code where an exception might occur
}
catch (ExceptionType1 name1)
{
// Code for handling ExceptionType1
}
catch (ExceptionType2 name2)
{
// Code for handling ExceptionType2
}
catch (ExceptionType3 name3)
{
// Code for handling ExceptionType3
}
Örnek:
kod | Konsol çıkışı |
---|---|
|
|
catch
4. Blok sırası
Bir blokta meydana gelen istisnalar try
sadece tek bir blok tarafından yakalanabilir catch
. Birden çok bloktan gelen kodun yürütüldüğü bir istisna işleme durumuna sahip olamazsınız .catch
Ancak blokların sırası önemlidir.
Bir istisnanın birden fazla blok tarafından yakalanabileceği bir durumla karşılaşabilirsiniz. Durum buysa, istisna hangi catch bloğu önce gelirse (bloğa en yakın ) tarafından yakalanacaktır try
.
Birden çok catch bloğunun aynı istisnayı yakalayabileceği bir duruma nasıl sahip olabilirsiniz?
Tüm istisnalar tek bir kalıtım hiyerarşisine aittir - şemaya bakın.
Bir nesne, türü veya ata sınıflarından herhangi biriArithmeticException
olan bir değişkene atanabilir : , ve - diyagrama bakın.ArithmeticException
RuntimeException
Exception
Throwable
Seviye 21'de kalıtım ve ata sınıfları hakkında daha fazla konuşacağız.
Bu kod gayet iyi derlenecek:
Mirasın faydaları: |
---|
|
ArithmeticException
Böylece yukarıdaki 4 bloktan herhangi biri ile an yakalayabilirsiniz catch
.
Örnek 1:
kod | Konsol çıkışı |
---|---|
|
|
Bu örnekte, hem ve blokları ArithmeticException
tarafından yakalanabilir . Bloğa en yakın blok olan ilk blok tarafından yakalanacaktır .catch (Exception e)
catch (ArithmeticException e)
try
catch
Sürprizlerden kaçınmak için, blok listesinin sonuna yakın bir yerecatch
neredeyse her istisnayı yakalayabilen bloklar yerleştirmek en iyisidir .catch
Tür genellikle Java'daki olası tüm istisnaları yakalamaThrowable
yeteneğine sahiptir . İlk bloğa koyarsanız , derleyici ulaşılamaz kod blokları olduğunu bildiğinden kod derlenmez.catch
GO TO FULL VERSION