
Peter Holmes
0
2788
787
Programlamadaki bir İstisna, programın yürütülmesinde bir noktada istisnai bir durumu belirtir. İstisnai koşulun karşılaştığı yerden başka bir yerde daha iyi ele alınabildiği durumlarda kullanılır. Aşağıdaki örnekleri göz önünde bulundurun:
- Bir yapılandırma dosyasını açmamak, belki alternatif bir yapılandırma dosyası konumu kullanarak kodda daha iyi ele alınabilir.
- Bir dizi öğesine erişme Java ArrayList Nasıl Kullanılır Java ArrayList Nasıl Kullanılır Java arraylist genel amaçlı bir yeniden boyutlandırılabilir dizidir. Genellikle diğer dillerde dizilerden beklenen tesislerin çoğunu sağlar. Bu yazıda bir arraylist kurmayı ve kullanmayı öğreneceksiniz. dizinin sınırları dışında bir program hatası olduğunu gösterir. Mutlu hata ayıklama!
- XML dosyasının düzeltilebilmesi için, kullanıcının bildirimine bir XML ayrıştırma hatası getirilmelidir..
- Bellek yetersiz çalışıyor (belki büyük bir dosyayı işlerken) java işleminde kullanılabilir bellek miktarını artırarak düzeltilebilir.
Bütün bu durumlarda (ve daha fazlası) istisna, üretildiği yerin dışında ele alınmalıdır, böylece temel sebep giderilebilir.
İstisna Türleri
Aşağıdaki resim Java İstisna Hiyerarşisinin ana bölümlerini göstermektedir. Temel sınıf Atılabil hangi sınıflara ayrılır İstisna ve Hata. Sınıf İstisna uygulamaların durumu kurtarmak için yakalayabileceği programla ilgili koşullar içindir. Sınıf Hata, Öte yandan, Java Çalışma Zamanı Ortamı'nda uygulamaların yakalayamaması gereken ciddi hataları belirtmek içindir. Bazı örnekler: OutOfMemoryError ve StackOverflowError.
bir İstisna yine iki tiptir: işaretli ve işaretsiz. Kontrol edilen bir istisna çağıran kod tarafından ele alınmalıdır. Bu kural java derleyicisi tarafından uygulanır. Kontrolsüz bir istisna ise, açıkça ilan etmek 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ı işaretli bir istisna atar FileNotFoundException arama koduyla ele alınması veya atılması gerektiğini beyan etmesi.
Aşağıdaki kod değil hiçbiri olmadığından derleme.
private void loadFile (Dize dosya adı) FileReader in = new FileReader (dosya adı);
Kodu derlemenin bir yolu istisnayı ele almaktır (aşağıya bakınız).
private void loadFile (String dosya adı) try FileReader in = yeni FileReader (dosya adı)); yakalamak (FileNotFoundException ex) // burada istisna burada
İstisna doğrudan arayan tarafından işlenemiyorsa, yöntem imzasında beyan edilmelidir..
private void loadFile (String dosya adı), java.io.FileNotFoundException 'ı (FileReader in = new FileReader (dosya adı));
İşaretlenmeyen İstisnalar
İşaretlenmemiş bir istisna, alt sınıftan biridir. Çalışma zamanı istisnası ve doğrudan ele alınması veya yukarıdaki gibi ilan edilmesi gerekmez. Örneğin, aşağıdaki kod bir NullPointerException, bu bir tür Çalışma zamanı istisnası. Kod, ancak o zamandan beri hatasız derleniyor NullPointerException denetlenmeyen bir istisnadır.
private void handleEvent () String name = null; if (name.length ()> 0)
Ambalaj İstisnaları
Kontrol edilen ve işaretlenmeyen istisnalar hakkında yukarıdaki tartışma göz önüne alındığında, onları bildirmek veya kendinizle ilgilenmek zorunda olmadığınızdan, denetlenmeyen istisnalarla uğraşmanın daha kolay olduğu anlaşılmaktadır. Bu kolaylık göz önünde bulundurulduğunda, kontrol edilen bir istisnayı kontrol edilmeyen istisnalara sarmak bazen yararlı olabilir.
Aşağıdaki kod örneği, bir özel durumun nasıl sarıldığını gösteriyor. 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 attı … yeni SQLException attı;
Bu yöntem başka bir yöntemden çağrıldığında (method_2 ()), bu yöntem yakalayabilir SQLException ve denetlenmeyen bir istisna içine sarın, bu nedenle istisnayı yöntem imzasında bildirmesi gerekmez.
özel geçersiz yöntem_2 () try method_1 (); catch (java.sql.SQLException ex) yeni RuntimeException (ex) atma;
İstisna Yığın Takibi
Bir İstisna Yığın İzi, her biri istisnanın fırlatıldığı sırada JVM tarafından yakalanan bir yöntem başlatmasını temsil eden aktif yığın çerçevelerinin dizisini ifade eder. Her yığın çerçevesi, sınıf adını, yöntem adını ve muhtemelen java kaynak dosya adını ve dosya içindeki satır numarasını içeren yöntem çağrısının konumunu içerir. Hataya neden olan aramaların sırasını izlemek için kullanışlıdır. Java İstisnaları: Bunları Doğru mu kullanıyorsunuz? Java İstisnaları: Onları Doğru mu Kullanıyorsunuz? Programlamadaki bir İstisna, programın yürütülmesinde istisnai bir durumu belirtir. Durum başka yerlerde daha iyi ele alındığında kullanılır. Aşağıdaki Java istisna işleme örneklerini göz önünde bulundurun. .
Özel durum nesnesinden yakalandığında elde edilen tipik bir yığın izlemesi.
İş parçacığında "main" java.lang.IndexOutOfBoundsException: Dizin: 8, Boyut: 5, java.util.ArrayList.rangeCheck (ArrayList.java:653), java.util.ArrayList.get (ArrayList.java:429) adresinde sample.sample1.main (sample1.java:24)
Burada yakalanan istisna IndexOutOfBoundsException. Hata hakkında ek bilgi içerir. Yığın izi, her biri gösterildiği gibi konum bilgisini içeren 3 yığın çerçevesi içerir.
İstisnaları İşleme
Bir istisna, onu yakalayarak ele alınabilir. try-catch gereken düzeltici önlemleri almak ve engellemek. İstisna nesne, kendisine neden olan koşul hakkında bilgi almak için çeşitli yöntemler sunar..
Aşağıdaki kod hata mesajını bir günlük dosyasına kaydeder..
private void loadConfig () try //, bir IOException yakalayabilecek kodu çağırın catch (java.io.IOException ex) // istisna burada. Bir günlük dosyasına günlük olabilir. log.warning (ex.getMessage ());
Bir istisna başka bir şeyin içine sarıldığında, sarılmış istisnayı alabilirsiniz:
Atılabilir neden = ex.getCause (); log.warning ("Altta yatan neden:" + cause.getMessage ());
Yığın izlemesine erişmeniz ve belki de buna neden olan yöntemin adını çıkarmanız gerekiyor mu??
StringBuilder sbuf = yeni StringBuilder ("Yığın İzleme:"); (StackTraceElement el: ex.getStackTrace ()) sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); log.warning (sbuf.toString ());
Ya da belki, istisnayı günlüğe kaydedin ve yeniden açın?
… catch'i deneyin (java.io.IOException ex) log.warning (ex.getMessage ()); eski fırlatmak;
İstisna sınıf bir sağlar Yığın İzi yazdır() yığın izini kendiniz yazdırabileceğiniz bir yöntem PrintStream (veya PrintWriter).
… yakalamayı deneyin (java.io.IOException ex) PrintStream out =…; out.println (ex.getMessage ()); ex.printStackTrace (çıkış);
Tek seferde birden fazla istisna türü yakalayabilirsiniz. Deneyin engelle ve her istisna türü için özel işlem gerçekleştir.
deneyin // buraya bazı istisnalar atar catch (java.io.IOException ex) // burada IOException'a özel işlem yapma catch (java.sql.SQLException ex) // burada SQLException özel işleme
Birden fazla istisna türünü yakalamak, ancak aynı işleme kodunu kullanmak için, yakalamak aşağıdaki gibi birden çok türe sahip blok:
// buraya bazı istisnalar atar deneyin catch (java.io.IOException | java.sql.SQLException ex) // burada IOException ve SQLException'a özgü işlem yapma catch (SAXException ex) // burada SAXException'a özel işlem yapma
Kaynakları Sonunda Temizleme
İstisnalar oluşturabilen kodlarla uğraşırken, açılmış dosyalar gibi tüm kaynakların uygun şekilde temizlenmesi esastır. Dosya Formatları ve Özellikleri Hakkında Bilmeniz Gereken Her Şey Dosya Formatları ve Özellikleri Hakkında Bilmeniz Gereken Her Şey dosya değişmeli olarak: müzik, resim, elektronik tablo, slayt gösterisi vb. Ama yine de bir dosyayı "dosya" yapan nedir? Bilgisayarın bu temel kısmını anlamaya çalışalım. , veritabanı bağlantıları, vb. Kaynak temizliği bir ortamda yapılmalıdır. en sonunda blok. Bu şekilde hem normal çıkış hem de bir bloktan istisnai çıkış, temizleme kodunu çağırır. Tarihin En Kötü 10 Programlama Yanılgısı Tarihin 10 En Kötü Programlama Yanılgısı Biraz hatalı kod örneği, felakete büyük ölçüde neden oldu. Aşağıdaki, tarihteki en kötü programlama hatalarından 10 tanesidir.. .
InputStream in = null; deneyin … in = new FileInputStream (dosya adı);… catch (java.io.IOException ex) log.warning (ex.getMessage ()); nihayet // buradaki kod, try bloğundan çıkarken çalıştırılır, // normal veya istisnasız olması durumunda (in! = null) in.close ();
Kaynaklarla Dene Bloğu
Java 1.7 tanıttı deneyin-ile-kaynaklar kaynak temizliğini kolaylaştıran yapı. Bu gibi görünüyor:
deneyin (InputStream in = new FileInputStream (…)) // InputStream'i kullanan kod.
Kod bloktan çıktığında (temiz veya bir istisna nedeniyle), inputStream değişken otomatik olarak temizlenir.
Hepsini bloğun başında ilan ederek birden fazla kaynağı temizleme.
deneyin (InputStream in = new FileInputStream (…); Connection 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, bazı özel temizleme işlemlerini kapat() yöntem.
genel sınıf MyClass AutoCloseable uygular public void close () // burada temizleme kodu
Bu sınıfın bir örneğini bir deneyin-ile-kaynaklar blok.
try (MyClass obj = new MyClass (…)) // MyClass nesnesini kullanan kod.
Bazı Sık Karşılaşılan İstisnalar
Şimdi sık karşılaşılan bazı istisnalara bir göz atalım.
- IndexOutOfBoundsException (işareti kaldırıldı): erişilen öğenin dizininin dizinin, dizenin vb. sınırlarının dışında olduğunu gösterir..
- SQLException (kontrol edildi): bir veritabanı hatası nedeniyle atıldı.
- IOException (işaretli): dosya erişim hatası veya giriş ve çıkışla ilgili hatalar.
- InterruptedException (kontrol edildi): iplik yürütme kesintiye uğradığında atılır.
- SAXException (kontrol edildi): XML ayrıştırma hataları nedeniyle atıldı.
- NullPointerException (işaretlenmemiş): bir nesnenin gerekli olduğu yerde null kullanma.
Kaydırma
İstisnalar, Java'da hata raporlama ve yönetim için birincil yöntemdir. Özel durumların doğru kullanımı, kod kalitesini artırır Özel Metin Temaları ile Linux Metin Düzenleyicinize Yazma veya Daha Hızlı Kod Yazma Özel Tema Metinleri ile Özel Metin Kodları ile Linux Metin Düzenleyicinize Yazma veya Daha Hızlı Yazma Komut dosyası yazarak ve kodlayarak veya aracı bir biçimlendirme düzenleyicisi olarak kullanıp kullanmamaya karar vermeyin. ve üretimdeki sorunların çözümünde yardım.
İstisna ile ilgili herhangi bir savaş hikayeniz var mı? Eğer öyleyse, bize aşağıdaki yorumlar bölümünde bize bildirin.
Resim Kredisi: Shutterstock.com üzerinden Dmitry Nikolaev