Java İstisnaları Nasıl Doğru Şekilde İşlenir?

Java İstisnaları Nasıl Doğru Şekilde İşlenir?

Bir programlama acemi olarak, kavramı istisna işleme kafanı sarmak zor olabilir. Kavramın kendisi zor olduğundan değil, ancak terminoloji onu olduğundan daha gelişmiş gösterebilir. Ve o kadar güçlü bir özellik ki, kötüye kullanıma ve kötüye kullanıma meyilli.





Bu makalede, istisnaların neler olduğunu, neden önemli olduklarını, nasıl kullanılacağını ve kaçınılması gereken yaygın hataları öğreneceksiniz. Çoğu modern dilde bir tür istisna işleme vardır, bu nedenle Java'dan geçerseniz bu ipuçlarının çoğunu yanınıza alabilirsiniz.





Java İstisnalarını Anlamak

Java'da, bir istisna uygulamanızın çalışması sırasında anormal (veya 'olağanüstü') bir şey olduğunu belirten bir nesnedir. Bu tür istisnalar fırlatılmış , temel olarak bir istisna nesnesinin yaratıldığı anlamına gelir (hataların nasıl 'yükseltildiğine' benzer şekilde).





Güzellik şu ki, yapabilirsin tutmak anormal durumla başa çıkmanıza ve uygulamanızın hiçbir şey ters gitmemiş gibi çalışmaya devam etmesine izin veren özel durumlar. Örneğin, C'deki bir boş gösterici uygulamanızı çökertebilirken, Java fırlatıp yakalamanıza izin verir.

NullPointerException

s önce boş bir değişkenin çökmeye neden olma şansı vardır.



Unutmayın, bir istisna sadece bir nesnedir, ancak önemli bir özelliği vardır:

Exception

sınıfı veya herhangi bir alt sınıfı





Exception

. Java'nın her türlü yerleşik istisnası olsa da, isterseniz kendinizinkini de oluşturabilirsiniz. Bazıları en yaygın Java istisnaları Dahil etmek:

  • NullPointerException
  • NumberFormatException
  • IllegalArgumentException
  • RuntimeException
  • IllegalStateException

Peki bir istisna attığınızda ne olur?





İlk olarak, Java, attığınız istisna türünü işleyen bir kod olup olmadığını görmek için hemen yöntemin içine bakar. Bir işleyici yoksa, orada bir tanıtıcı olup olmadığını görmek için mevcut yöntemi çağıran yönteme bakar. Değilse, çağrılan yönteme bakar. o yöntem ve ardından bir sonraki yöntem vb. Özel durum yakalanmazsa, uygulama bir yığın izi yazdırır ve ardından çöker. (Aslında sadece çökmekten daha nüanslıdır, ancak bu, bu makalenin kapsamının ötesinde gelişmiş bir konudur.)

İLE yığın izleme bir istisna işleyicisi ararken Java'nın geçtiği tüm yöntemlerin bir listesidir. Bir yığın izlemesi şöyle görünür:

Exception in thread 'main' java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Bundan çok şey çıkarabiliriz. İlk olarak, atılan istisna bir

NullPointerException

. yılında meydana geldi

getTitle()

Book.java'nın 16. satırındaki yöntem. Bu yöntem çağrıldı

getBookTitles()

Author.java'nın 25. satırında. o yöntem çağrıldı

main()

Bootstrap.java'nın 14. satırında. Gördüğünüz gibi, tüm bunları bilmek hata ayıklamayı kolaylaştırır.

Ancak yine de, istisnaların gerçek yararı, istisnayı yakalayarak, işleri doğru ayarlayarak ve çökmeden uygulamayı devam ettirerek anormal durumla 'başa çıkabilmeniz'dir.

Kodda Java İstisnalarını Kullanma

sende var diyelim

someMethod()

bu bir tamsayı alır ve tamsayı 0'dan küçük veya 100'den büyükse bozulabilecek bir mantık yürütür. Bu, bir istisna atmak için iyi bir yer olabilir:

sim kart nasıl hacklenir
public void someMethod(int value) {
if (value 100) {
throw new
IllegalArgumentException

Bu istisnayı yakalamak için nereye gitmeniz gerekiyor?

someMethod()

çağrılır ve kullanılır try-catch bloğu :

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
}
// ...
}

içindeki her şey denemek blok, bir istisna atılana kadar sırayla yürütülür. Bir istisna atılır atılmaz, sonraki tüm ifadeler atlanır ve uygulama mantığı hemen şuraya atlar: tutmak engellemek.

Örneğimizde try bloğuna girip hemen çağırıyoruz.

someMethod()

. 200, 0 ile 100 arasında olmadığından, bir

IllegalArgumentException

Atıldı. Bu, yürütmeyi hemen sona erdirir

someMethod()

, try bloğundaki mantığın geri kalanını atlar (

someOtherMethod()

asla çağrılmaz) ve yürütmeyi catch bloğu içinde sürdürür.

arasaydık ne olurdu

someMethod(50)

Bunun yerine? NS

IllegalArgumentException

asla atılmazdı.

someMethod()

normal olarak yürütecekti. try bloğu normal şekilde yürütülür ve

someOtherMethod()

someMethod() tamamlandığında. Ne zaman

someOtherMethod()

biterse, yakalama bloğu atlanır ve

callingMethod()

devam edecekti.

Her bir try bloğu için birden fazla yakalama bloğunuz olabileceğini unutmayın:

public void callingMethod() {
try {
someMethod(200);
someOtherMethod();
} catch (IllegalArgumentException e) {
// handle the exception in here
} catch (NullPointerException e) {
// handle the exception in here
}
// ...
}

Ayrıca isteğe bağlı bir nihayet blok da var:

public void method() {
try {
// ...
} catch (Exception e) {
// ...
} finally {
// ...
}
}

Bir nihayet bloğundaki kod her zaman ne olursa olsun idam edildi. Try bloğunda bir return ifadeniz varsa, yöntemden çıkılmadan önce nihayet bloğu yürütülür. Catch bloğuna başka bir istisna atarsanız, istisna atılmadan önce nihayet blok yürütülür.

Metot sona ermeden önce temizlenmesi gereken nesneleriniz olduğunda nihayet bloğunu kullanmalısınız. Örneğin, try bloğunda bir dosya açtıysanız ve daha sonra bir istisna attıysanız, nihayet bloğu yöntemden çıkmadan önce dosyayı kapatmanıza izin verir.

Bir catch bloğu olmadan da bir nihayet bloğunuz olabileceğini unutmayın:

public void method() {
try {
// ...
} finally {
// ...
}
}

Bu, atılan istisnaların yöntem çağırma yığınını yaymasına izin verirken gerekli temizlemeyi yapmanıza izin verir (yani, buradaki istisnayı ele almak istemezsiniz, ancak yine de önce temizlemeniz gerekir).

Java'da Kontrol Edilen ve Kontrol Edilmeyen İstisnalar

Çoğu dilin aksine, Java aşağıdakileri ayırt eder: kontrol edilen istisnalar ve işaretlenmemiş istisnalar (örneğin, C# yalnızca denetlenmeyen istisnalara sahiptir). Kontrol edilen bir istisna zorunlu istisnanın atıldığı yöntemde yakalanmayın, aksi takdirde kod derlenmez.

İşaretli bir istisna oluşturmak için, şuradan genişletin:

Exception

. Denetlenmeyen bir istisna oluşturmak için şuradan genişletin:

RuntimeException

.

Kontrol edilen bir istisna oluşturan herhangi bir yöntem, bunu kullanarak yöntem imzasında belirtmelidir. atar anahtar kelime. Java'nın yerleşik olduğundan beri

IOException

kontrol edilen bir istisnadır, aşağıdaki kod derlenmez:

public void wontCompile() {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Önce kontrol edilen bir istisna oluşturduğunu beyan etmelisiniz:

public void willCompile() throws IOException {
// ...
if (someCondition) {
throw new IOException();
}
// ...
}

Bir yöntemin bir istisna atıyor olarak bildirilebileceğini, ancak hiçbir zaman aslında bir istisna atmadığını unutmayın. Öyle olsa bile, istisnanın hala yakalanması gerekecek, aksi takdirde kod derlenmeyecektir.

İşaretli veya işaretlenmemiş istisnaları ne zaman kullanmalısınız?

Resmi Java belgelerinde bir bu sorudaki sayfa . Aradaki farkı kısa ve öz bir kuralla özetliyor: 'Bir müşterinin bir istisnadan makul bir şekilde kurtulması bekleniyorsa, bunu kontrol edilen bir istisna yapın. Bir istemci istisnadan kurtulmak için hiçbir şey yapamıyorsa, bunu denetlenmeyen bir istisna yapın.'

Ancak bu yönerge eski olabilir. Bir yandan, kontrol edilen istisnalar daha sağlam kodla sonuçlanır. Öte yandan, başka hiçbir dil istisnaları Java ile aynı şekilde kontrol etmemiştir, bu iki şeyi gösterir: birincisi, özellik diğer dillerin onu çalması için yeterince kullanışlı değildir ve ikincisi, kesinlikle onlarsız yaşayabilirsiniz. Ayrıca, kontrol edilen istisnalar, Java 8'de tanıtılan lambda ifadeleriyle iyi oynamaz.

Java İstisnaları Kullanımı için Yönergeler

İstisnalar faydalıdır, ancak kolayca kötüye kullanılabilir ve kötüye kullanılabilir. Bunları bir karmaşa haline getirmekten kaçınmanıza yardımcı olacak birkaç ipucu ve en iyi uygulamaları burada bulabilirsiniz.

  • Özel istisnaları genel istisnalara tercih edin. |_+_| üzerinde |_+_| mümkün olduğunda, aksi takdirde |_+_| üzerinde |_+_| mümkün olunca.
  • Asla yakalanma |_+_| ! |__+_| sınıf aslında |_+_| , ve catch bloğu aslında |__+_| ile çalışır. veya Atılabilir'i genişleten herhangi bir sınıf. Ancak, |__+_| sınıf ayrıca |_+_| ve asla bir |__+_| yakalamak istemezsiniz. çünkü |__+_| s ciddi kurtarılamaz sorunları gösterir.
  • Asla yakalanma |_+_| ! |_+_| uzanır |_+_| , böylece |__+_| yakalayan herhangi bir blok |__+_| ve bu, ne yaptığınızı bilmiyorsanız (özellikle çok iş parçacıklı uygulamalarda) uğraşmak istemediğiniz çok önemli bir istisnadır. Bunun yerine hangi istisnayı yakalayacağınızı bilmiyorsanız, hiçbir şey yakalamamayı düşünün.
  • Hata ayıklamayı kolaylaştırmak için açıklayıcı mesajlar kullanın. Bir istisna attığınızda, bir |__+_| bir argüman olarak mesaj. Bu mesaja yakalama bloğundan |_+_| yöntemidir, ancak istisna hiçbir zaman yakalanmazsa, mesaj yığın izlemenin bir parçası olarak da görünür.
  • İstisnaları yakalamamaya ve görmezden gelmemeye çalışın. Kontrol edilen istisnaların rahatsızlığını aşmak için, birçok acemi ve tembel programcı bir yakalama bloğu oluşturacak ancak onu boş bırakacaktır. Kötü! Her zaman zarif bir şekilde ele alın, ancak yapamıyorsanız, en azından bir yığın izi yazdırın, böylece istisnanın atıldığını bilirsiniz. Bunu |_+_| yöntem.
  • İstisnaları aşırı kullanmaktan sakının. Elinizde çekiç varsa her şey çivi gibi görünür. İstisnaları ilk öğrendiğinizde, uygulamanızın kontrol akışının çoğunun istisna işlemeye geldiği noktaya kadar her şeyi bir istisnaya dönüştürmek zorunda hissedebilirsiniz. Unutmayın, istisnalar 'istisnai' durumlar içindir!

Artık istisnaların ne olduğunu, neden kullanıldığını ve bunları kendi kodunuza nasıl dahil edeceğinizi anlamak için istisnalar konusunda yeterince rahat olmalısınız. Konsepti tam olarak anlamadıysanız, sorun değil! Kafamda 'tıklaması' biraz zaman aldı, bu yüzden acele etmen gerektiğini düşünme. Acele etmeyin.

Herhangi bir sorunuz var mı? Kaçırdığım istisnalarla ilgili diğer ipuçlarını biliyor musunuz? Onları aşağıdaki yorumlarda paylaşın!

Paylaş Paylaş Cıvıldamak E-posta Herhangi Bir Projenin Verilerini Görselleştirmek için Veri Akış Şeması Nasıl Oluşturulur

Herhangi bir sürecin veri akışı diyagramları (DFD), verilerin kaynaktan hedefe nasıl aktığını anlamanıza yardımcı olur. İşte nasıl oluşturulacağı!

Sonrakini Oku
İlgili konular
  • Programlama
  • Java
Yazar hakkında Joel Lee(1524 Makale Yayınlandı)

Joel Lee, 2018'den beri MakeUseOf'un Genel Yayın Yönetmenidir. Bilgisayar Bilimleri alanında ve dokuz yılı aşkın profesyonel yazma ve düzenleme deneyimi.

Windows 10, bilgisayarınızı sıfırlarken bir sorun oluştu
Joel Lee'dan Daha Fazla

Haber bültenimize abone ol

Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!

Abone olmak için buraya tıklayın