3. Sarma istisnaları

Kontrol edilen istisnalar teoride harika görünüyordu, ancak pratikte büyük bir hayal kırıklığı olduğu ortaya çıktı.

Diyelim ki projenizde çok popüler bir yönteminiz var. Programınızdaki yüzlerce yerden çağrılır. Ve buna yeni bir işaretli istisna eklemeye karar veriyorsunuz . Ve bu kontrol edilen istisna gerçekten önemli ve o kadar özel olabilir ki, main()yakalanırsa ne yapacağını yalnızca yöntem bilir.

Bu, süper popüler yönteminizi çağıran her yöntemin yan tümcesine işaretli istisnayı eklemeniz gerekeceğithrows anlamına gelir . throwsBu yöntemleri çağıran tüm yöntemlerin yan tümcesinde olduğu gibi . Ve bu yöntemleri çağıran yöntemlerden.

Sonuç olarak, throwsprojedeki yöntemlerin yarısının yan tümceleri yeni bir kontrol edilen istisna alır. Ve tabii ki projeniz testlerle kapsanıyor ve artık testler derlenmiyor. Ve şimdi, testlerinizde throws yan tümcelerini de düzenlemeniz gerekiyor.

Ve sonra tüm kodunuz (yüzlerce dosyadaki tüm değişiklikler) diğer programcılar tarafından gözden geçirilmelidir. Ve bu noktada kendimize neden projede bu kadar çok kanlı değişiklik yaptığımızı soruyoruz. Çalışma günleri ve başarısız testler - hepsi kontrol edilen bir istisna eklemek uğruna mı ?

Ve tabii ki, kalıtım ve metot geçersiz kılma ile ilgili problemler hala var. Kontrol edilen istisnalardan kaynaklanan sorunlar, faydadan çok daha büyüktür. Sonuç olarak, artık çok az insan onları seviyor ve çok az insan kullanıyor.

Ancak, kontrol edilen bu istisnaları içeren çok sayıda kod (standart Java kitaplık kodu dahil) vardır . Onlarla ne yapılmalı? Onları görmezden gelemeyiz ve onlarla nasıl başa çıkacağımızı bilmiyoruz.

Java programcıları, kontrol edilen istisnaları RuntimeException. Başka bir deyişle, kontrol edilen tüm istisnaları yakalayın ve ardından kontrol edilmeyen istisnalar oluşturun (örneğin, RuntimeException) ve bunların yerine onları atın. Bunu yapmak şuna benzer:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

Bu çok hoş bir çözüm değil, ama burada suç teşkil eden hiçbir şey yok: istisna basitçe bir RuntimeException.

İstenirse, oradan kolayca alabilirsiniz. Örnek:

kod Not
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Nesnenin içinde saklanan istisnayı alın RuntimeException. Değişken cause, null

türünü belirleyebilir ve kontrol edilen bir istisna türüne dönüştürebilir.