İlan

Programlamada bir İstisna, programın yürütülmesinin bir noktasında istisnai bir koşulu belirtir. İstisnai durumun karşılaşıldığı yerden başka bir yerde daha iyi ele alınabildiği durumlarda kullanılır. Aşağıdaki örnekleri düşünün:

  • Bir yapılandırma dosyasının açılmaması, belki alternatif bir yapılandırma dosyası konumu kullanılarak kodda daha iyi ele alınabilir.
  • Bir dizi öğesi Java ArrayList Nasıl KullanılırJava dizisi genel amaçlı yeniden boyutlandırılabilir bir dizidir. Genellikle diğer dizilerden dizilerden beklenen olanakların çoğunu sağlar. Bu makalede bir arraylist kurmayı ve kullanmayı öğreneceksiniz. Daha fazla oku dizinin sınırları dışında bir program hatası anlamına gelir. Mutlu hata ayıklama!
  • XML dosyasının düzeltilebilmesi için bir XML ayrıştırma hatası kullanıcının bildirimine getirilmelidir.
  • Bellek yetersiz (belki de büyük bir dosya işlenirken) program, belki de java işlemi için kullanılabilir bellek miktarını artırarak düzeltilebilir.

Tüm bu durumlarda (ve daha fazlasında) istisna, oluşturulduğu yerin dışında ele alınmalıdır, böylece altta yatan neden ele alınabilir.

instagram viewer

İstisna Türleri

Aşağıdaki resim Java İstisna Hiyerarşisinin ana bölümlerini göstermektedir. Temel sınıf Atılabil alt sınıfta İstisna ve Hata. Sınıf İstisna durumun kurtarılması amacıyla uygulamaların yakalayabileceği programla ilgili koşullar içindir. Sınıf HataÖte yandan, Java Çalışma Zamanı Ortamında uygulamaların yakalamaması gereken ciddi hataları göstermek içindir. Bazı örnekler: OutOfMemoryError ve StackOverflowError.

İstisna Hiyerarşisi

bir İstisna yine iki tiptir: işaretli ve işaretsiz. İşaretli bir istisna çağrı kodu tarafından ele alınmalıdır. Bu kural java derleyicisi tarafından uygulanır. Öte yandan, kontrol edilmeyen bir istisna, açıkça bildirmek zorunda kalmadan çağrı zincirine yayılabilir. Aşağıdaki örnekler açıklığa kavuşacaktır.

Kontrol Edilen İstisnalar

Aşağıdaki yöntem oluşturmaya çalışır FileReader bir dosyadan. Yapıcı kontrol edilmiş bir istisna atar FileNotFoundException çağrı kodu tarafından işlenmesi veya atıldığı beyan edilmelidir.

Aşağıdaki kod değil hiçbiri olmadığı için derleyin.

private void loadFile (Dize dosya adı) {FileReader in = yeni FileReader (dosya adı); }

Kodun derlenmesini sağlamanın bir yolu istisnayı işlemektir (aşağıya bakın).

private void loadFile (Dize dosya adı) {try {FileReader in = yeni FileReader (dosya adı)); {} catch (FileNotFoundException ex) {// burada istisnayı işleyin} }

İstisna doğrudan arayan tarafından işlenemezse, yöntem imzasında bildirilmelidir.

private void loadFile (Dize dosya adı) java.io'yu atar. FileNotFoundException. {FileReader in = yeni FileReader (dosya adı)); { }

İşaretlenmeyen İstisnalar

İşaretlenmeyen bir istisna, alt sınıftan Çalışma zamanı istisnası ve doğrudan ele alınması veya yukarıdaki gibi beyan edilmesi gerekmez. Örneğin, aşağıdaki kod bir NullPointerException, bu bir tür Çalışma zamanı istisnası. Ancak kod hatasız bir şekilde derleniyor NullPointerException denetlenmeyen bir istisnadır.

özel void handleEvent () {Dize adı = boş; if (name.length ()> 0) {} }

Sarma İstisnaları

Kontrol edilen ve kontrol edilmeyen istisnalar hakkındaki yukarıdaki tartışma göz önüne alındığında, onları beyan etmek veya kendiniz ele almak zorunda olmadığınız için kontrol edilmeyen istisnalarla başa çıkmak daha kolay görünüyor. Bu kolaylık göz önünde bulundurularak, işaretli bir istisnayı kontrol edilmeyen bir istisnaya sarmak bazen yararlı olabilir.

Aşağıdaki kod örneği, bir özel durumun nasıl kaydırılacağını gösterir. Yöntem Yöntem 1() atar SQLException vücudunda. Kodun doğru bir şekilde derlenmesi için istisnanın atıldığı bildirilmelidir.

private void method_1 () SQLException atar {... yeni SQLException atın; }

Bu yöntem başka bir yöntemden çağrıldığında (method_2 ()), bu yöntem SQLException ve denetlenmeyen bir istisna içine sarın, bu nedenle yöntem imzasında istisnayı bildirmesi gerekmez.

private void method_2 () {dene {method_1 (); } yakala (java.sql. SQLException ex) {yeni RuntimeException (ex) atın; } }

İstisna Yığını İzleme

Bir İstisna Yığını İzi, her biri istisna atıldığında JVM tarafından yakalanan bir yöntem çağrısını temsil eden etkin yığın kareleri dizisini ifade eder. Her yığın çerçevesi, sınıf adı, yöntem adı ve muhtemelen dosya içindeki java kaynak dosyası adı ve satır numarasını içeren yöntem çağırma konumunu içerir. Çağrı sırasını izlemek için kullanışlıdır hataya neden olan Java İstisnaları: Bunları Doğru Kullanıyor musunuz?Programlamada bir İstisna, programın yürütülmesinde istisnai bir koşulu belirtir. Durum başka yerlerde daha iyi ele alındığında kullanılır. Aşağıdaki Java özel durum işleme örneklerini göz önünde bulundurun. Daha fazla oku .

Burada, yakalandığında istisna nesneden elde edilen tipik bir yığın izidir.

"Main" iş parçacığında özel durum java.lang. IndexOutOfBoundsException: Dizin: 8, java.util'de Boyut: 5. Java.util'de ArrayList.rangeCheck (ArrayList.java: 653). Sample.ample1.main (sample1.java: 24) konumundaki ArrayList.get (ArrayList.java: 429)

Burada yakalanan istisna IndexOutOfBoundsException. Hata hakkında ek bilgiler içerir. Yığın izi, her biri gösterildiği gibi konum bilgilerini içeren 3 yığın çerçevesi içerir.

İstisnaları İşleme

Bir istisna, try-catch bloklayın ve gerekli düzeltici önlemleri alın. İstisna nesne, buna neden olan durum hakkında bilgi çıkarmak için çeşitli yöntemler sağlar.

Aşağıdaki kod, hata iletisini bir günlük dosyasına kaydeder.

private void loadConfig () {try {// bir IOException oluşturabilecek kodu çağır}} catch (java.io. IOException ex) {// burada istisnayı ele alır. Bir günlük dosyasına kaydedilebilir. log.warning (ex.getMessage ()); } }

Bir istisna diğerinin içine sarıldığında, kaydırılan istisnayı alabilirsiniz:

Atılabilir neden = ex.getCause (); log.warning ("Temel neden:" + cause.getMessage ()); 

Yığın izlemesine erişmeniz ve buna neden olan yöntemin adını çıkarmanız gerekiyor mu?

StringBuilder sbuf = new StringBuilder ("Stack Trace:"); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());

Ya da belki, istisnayı günlüğe kaydedip yeniden mi?

Deneyin {... } yakala (java.io. IOException ex) {log.warning (ex.getMessage ()); eski atmak; }

İstisna sınıf bir Yığın İzi yazdır() yığın izlemesini kendi kendinize yazdırabilen yöntem PrintStream (veya PrintWriter).

Deneyin {... } yakala (java.io. IOException ex) {PrintStream çıkışı =...; out.println (ex.getMessage ()); ex.printStackTrace (çıkış); }

Tek bir sayfada birden fazla istisna türü yakalayabilirsiniz Deneyin engeller ve her bir istisna türü için özel işlem gerçekleştirir.

deneyin {// buraya bazı istisnalar atar. } yakala (java.io. IOException ex) {// Burada IOException'a özgü işlem. } yakala (java.sql. SQLException ex) {// Burada SQLException özel işleme. }

Birden fazla istisna türü yakalamak, ancak aynı işleme kodunu kullanmak için, tutmak aşağıdaki gibi birden fazla tip ile blok:

deneyin {// buraya bazı istisnalar atar. } yakala (java.io. IOException | java.sql. SQLException ex) {// IOException ve SQLException'a özgü işlem burada. } catch (SAXException ex) {// SAXException'a özgü işlem burada. }

Sonunda Kaynakları Temizleme

İstisnalar atabilecek kodla uğraşırken, herhangi bir kaynağın düzgün bir şekilde temizlenmesi, açık dosyalar gibi Dosya Biçimleri ve Özellikleri Hakkında Bilmeniz Gereken Her ŞeyKelime dosyasını birbirinin yerine kullanıyoruz: müzik, resim, e-tablo, slayt gösterisi vb. Ama bir dosyayı "dosya" yapan nedir? Bilgisayarın bu temel bölümünü anlamaya çalışalım. Daha fazla oku , veritabanı bağlantıları vb. Kaynak temizleme bir en sonunda blok. Bu şekilde hem normal çıkış hem de bir bloktan istisnai çıkış, temizleme kodu Tarihin En Kötü 10 Programlama HatasıHikâye ettiği geçmişte, kodlama da yıkımı imha etti. Biraz kötü kodun oluşması büyük bir felakete neden oldu. Aşağıdakiler tarihteki en kötü 10 programlama hatasıdır. Daha fazla oku .

InputStream girişi = null; Deneyin {... in = yeni FileInputStream (dosya adı);... } yakala (java.io. IOException ex) {log.warning (ex.getMessage ()); } nihayet {// kodu burada try bloğundan çıkıldığında yürütülür, // normalde ya da (in! = null) in.close () durumunda bir istisna nedeniyle; }

Kaynaklarla Dene Bloğu

Java 1.7, deneyin-ile-kaynaklar kaynak temizliğini kolaylaştıran yapı. Şöyle görünüyor:

denemek (InputStream in = yeni FileInputStream (..)) {// InputStream kullanan kod. }

Kod bloktan çıktığında (temiz veya istisna nedeniyle), inputStream değişken otomatik olarak temizlenir.

Hepsini bloğun kafasında bildirerek birden fazla kaynağı temizleyin.

try (InputStream in = yeni FileInputStream (..); Bağlantı con =...; ) {// InputStream ve Connection'ı kullanan kod. }

Sınıfı uygulayan herhangi bir nesne AutoCloseable arayüz bu şekilde temizlenebilir. Aşağıdaki sınıf, belirli bir temizleme işlemi gerçekleştirir. kapat() yöntem.

public class MyClass, AutoCloseable {public void close () {// temizleme kodunu buraya uygula} }

Bu sınıfın bir örneğini bir deneyin-ile-kaynaklar blok.

try (MyClass obj = new MyClass (..)) {// MyClass nesnesini kullanan kod. }

Sık Karşılaşılan Bazı İstisnalar

Şimdi sık karşılaşılan bazı istisnalara bir göz atalım.

  • IndexOutOfBoundsException (işaretlenmemiş): erişilen öğenin dizininin bir dizinin, dizenin vb. sınırlarının dışında olduğunu gösterir.
  • SQLException (işaretli): bir veritabanı hatası nedeniyle atıldı.
  • IOException (işaretli): dosya erişim hatası veya giriş ve çıkışla ilgili hatalar.
  • InterruptedException (işaretli): bir iş parçacığı yürütmesi kesintiye uğradığında atılır.
  • SAXException (işaretli): XML ayrıştırma hataları nedeniyle atılır.
  • NullPointerException (işaretsiz): bir nesnenin gerekli olduğu yerde null kullanımı.

Paketleme

İstisnalar, Java'da hata bildirimi ve yönetimi için birincil yöntemdir. İstisnaların uygun kullanımı kod kalitesini artırmak Özel Temalarla Linux Metin Düzenleyicinizde Daha Hızlı Yazma veya KodlamaLinux metin düzenleyicinizin sıkıcı ve "işlevsel" görünmesi gerekmez. Komut dosyası yazma ve kodlama veya aracı bir biçimlendirme düzenleyicisi olarak kullanma, üretkenliğinizi artırmak için neden ince ayar yapmıyorsunuz? Daha fazla oku ve üretimdeki sorunların çözülmesine yardımcı olur.

İlişkilendirilecek istisnalarla ilgili savaş hikayeleriniz var mı? Öyleyse, aşağıdaki yorumlar bölümünde bize anlatın.

Image Credit: Dmitry Nikolaev Shutterstock.com üzerinden