İstisna ve Hata Arasındaki Farklar


173

Temel Java ve Throwables'ın farklı türleri hakkında daha fazla bilgi edinmeye çalışıyorum, biri İstisnalar ve Hatalar arasındaki farkları bana bildirebilir mi?

Yanıtlar:


178

Hatalar yakalanmamalı veya ele alınmamalıdır (en nadir durumlar hariç). İstisnalar istisna işleme ekmek ve tereyağı vardır. Javadoc iyi açıklıyor:

Hata, makul bir uygulamanın yakalamaya çalışmaması gereken ciddi sorunları gösteren Throwable'ın bir alt sınıfıdır. Bu tür hataların çoğu anormal durumlardır.

ErrorJavaDoc yorumlarından bazılarını alarak alt sınıflarından birkaçına bakın :

  • AnnotationFormatError - Ek açıklama ayrıştırıcısı bir sınıf dosyasından bir ek açıklama okumaya çalıştığında ve ek açıklamanın hatalı biçimlendirildiğini belirlediğinde atılır.
  • AssertionError - Bir iddianın başarısız olduğunu göstermek için atılır.
  • LinkageError- LinkageError alt sınıfları, bir sınıfın başka bir sınıfa bağımlı olduğunu gösterir; ancak, ikinci sınıf, önceki sınıfın derlenmesinden sonra uyumsuz bir şekilde değişmiştir.
  • VirtualMachineError - Java Sanal Makinesinin bozulduğunu veya çalışmaya devam edebilmesi için gerekli kaynakların tükendiğini belirtmek için atılmıştır.

Gerçekten üç önemli alt kategori vardır Throwable:

  • Error - Yeterince şiddetli bir şey yanlış gitti, çoğu uygulama sorunu ele almaya çalışmak yerine çökmeli,
  • İşaretlenmemiş İstisna (aka RuntimeException) - Çoğunlukla NullPointerExceptionveya yasadışı bir argüman gibi bir programlama hatası . Uygulamalar bazen bu Throwablekategoriden yararlanabilir veya kurtarabilir - veya en azından Konu run()yönteminde yakalayabilir , şikayeti kaydedebilir ve çalışmaya devam edebilir.
  • İşaretli İstisna (diğer her şey) - Uygulamaların geri kalanı ile bir şey yakalayabilmesi ve anlamlı bir şekilde yapabilmesi beklenmektedir, FileNotFoundExceptionve TimeoutException...

10
Oracle diyor ki Unchecked exceptions != RuntimeExceptions; Unchecked exceptions = RuntimeExceptions + Errors. Soruyu gündeme getirdiğini biliyorum: Hata bir istisna mı? , ama yazdıkları bu. İşte bu örneklerden sadece bir tanesi: docs.oracle.com/javase/tutorial/essential/exceptions/… .
ROMANIA_engineer

1
Yanıtlanmamış soru, RuntimeException ve Error'ın özünde nasıl farklı olduğudur? Her ikisi de kontrol edilemez ve diğer her şekilde eşittir.
Pacerier

38

@ Georgios-gousios tarafından Java'nın istisna hiyerarşisini gösteren bu slayt , Java'daki Hatalar ve İstisnalar arasındaki farkları kısaca açıklar.

Java İstisna Hiyerarşisi


6
Birisi bir NullPointerException kurtarma görmek isterdim: D: D: D
Ignacio Soler Garcia

2
@IgnacioSolerGarcia Olabilir ve hatta bir anlamı vardır (diğer soru iyi olup olmadığıdır). Normalde nesnenin var olup olmadığını kontrol eder ve bundan sonra yöntemi çağırır veya alanı kullanır. Ancak varlığını kontrol etmek yerine NPE yakalamayı deneyin. Örneğin, bununla ilgili bir mesaj yazın ve devam edin.
Gangnus

@Gangnus: hiçbir anlam ifade etmiyor. Bir istisnanın kod bölümlerini atladığını ve normal işlemleri değil hataları bildirmenin bir yolu olduğunu unutmayın
Ignacio Soler Garcia

17

Hatalar, uygulamanızın bildiğiniz gibi sona erdiğini gösterir. Genellikle kurtarılamaz ve VM'nizin çıkmasına neden olur. Bunları yakalamak, çıkmadan önce muhtemelen günlük veya ekran ve uygun mesaj haricinde yapılmamalıdır.

Örnek: OutOfMemoryError - Programınız artık çalışamayacağı için yapabileceğiniz çok şey yok.

İstisnalar genellikle kurtarılabilir ve olmasa bile, genellikle sadece bir girişim girişiminin başarısız olduğu anlamına gelir, ancak programınız hala devam edebilir.

Örnek: IllegalArgumentException - Yöntem çağrısı başarısız olmak için bir yönteme geçersiz veriler iletildi , ancak gelecekteki işlemleri etkilemez.

Bunlar basit örneklerdir ve yalnızca İstisnalar hakkında başka bir bilgi zenginliği daha vardır.


Örnek olarak example.javacodegeeks.com/java-basics/exceptions/… adresine bakın . IllegalArgumentException Hata değil, Çalışma Zamanı istisnasıdır. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus

8

Hatalar -

  1. Errorjava s türündedir java.lang.Error.
  2. Java'daki tüm hatalar işaretlenmemiş türdedir.
  3. Errorçalışma zamanında olur. Derleyici tarafından bilinmeyeceklerdir.
  4. Hatalardan kurtulmak imkansızdır.
  5. Errors çoğunlukla uygulamanın çalıştığı ortamdan kaynaklanır.
  6. Örnekler: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

İstisnalar -

  1. Exceptionjava s türündedir java.lang.Exception.
  2. Exceptions hem işaretli hem de işaretsiz tip içerir.
  3. İşaretli özel durumların derleyici tarafından bilinmesi durumunda, denetlenmeyen özel durumların derleyici tarafından çalışma zamanında bilinmediği için bilinmez.
  4. İstisnalardan try-catchbloklar aracılığıyla işleyerek kurtarabilirsiniz .
  5. Exceptions çoğunlukla uygulamanın kendisinden kaynaklanır.
  6. Örnekler: Kontrol durumlar: SQLException, IOException
    denetlenmeyen durumlar: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

daha fazla okuma: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png


7

Güneş en iyisi :

Hata, makul bir uygulamanın yakalamaya çalışmaması gereken ciddi sorunları gösteren Throwable'ın bir alt sınıfıdır.


3

ErrorSınıfın açıklaması oldukça açıktır:

An Error, Throwable makul bir uygulamanın yakalamaya çalışmaması gereken ciddi sorunları gösteren bir alt sınıftır. Bu tür hataların çoğu anormal durumlardır. ThreadDeath Hata, "normal" bir durum olsa da, aynı zamanda bir alt sınıfıdır Erroruygulamaların çoğu bunu yakalamaya çalışmamalıdır çünkü.

Yöntemin Erroryürütülmesi sırasında atılabilecek ancak yakalanamayan alt sınıflarının herhangi bir alt maddesini beyan etmek için bir yönteme gerek yoktur, çünkü bu hatalar asla meydana gelmemesi gereken anormal durumlardır.

Java'nın sınıfınError kendi belgelerinden alıntılanmıştır .

Kısacası, bunu yakalamamalısınız Error, ancak bunu yapmak için iyi bir nedeniniz var. (Örneğin, bir sunucu uygulamasının belleği veya benzeri bir şey biterse web sunucusu uygulamanızın çökmesini önlemek için.)

Bir Exceptiondiğer taraftan, herhangi bir diğer modern dildeki gibi sadece normal bir istisnadır. Java API belgelerinde veya herhangi bir çevrimiçi veya çevrimdışı kaynakta ayrıntılı bir açıklama bulacaksınız.


2

Sınıflar java.lang.Exceptionve arasında birkaç benzerlik ve farklılık vardır java.lang.Error.

benzerlikler:

  • İlk - Her iki sınıfları uzanır java.lang.Throwableve bu şekilde hataları ile uğraşırken yaygındır yöntemlerin birçoğu sonucunda devralır kullanılacak: getMessage, getStackTrace, printStackTracevb.

  • İkincisi, java.lang.Throwableher ikisinin de alt sınıfları olarak aşağıdaki özellikleri miras alırlar:

    • Fırlatılabilir kendisi ve alt sınıflarından herhangi biri (dahil java.lang.Error) throwsanahtar kelime kullanılarak yöntem istisnaları listesinde bildirilebilir . İşbu beyan sadece gerekli java.lang.Exceptionve alt sınıfları için java.lang.Throwable, java.lang.Errorve java.lang.RuntimeExceptionve bunların alt sınıfları da isteğe bağlıdır.

    • java.lang.ThrowableBu catchmaddede yalnızca ve alt sınıfların kullanılmasına izin verilir .

    • java.lang.Throwable- anahtar kelimesi ile yalnızca ve alt sınıflar kullanılabilir throw.

Bu özelliğin sonucu her ikisini de takip eder java.lang.Errorve java.lang.Exceptionyöntem başlığında bildirilebilir, catchyan tümce olabilir, anahtar sözcük ile kullanılabilir throw.

farklılıklar:

  • İlk - kavramsal fark: java.lang.ErrorJVM tarafından atılacak ve ciddi sorunları gösterecek şekilde tasarlanmıştır ve yakalanmak yerine programın yürütülmesini durdurmayı amaçlamaktadır (ancak diğer herhangi bir java.lang.Throwablehalef için olduğu gibi mümkündür ).

    Javadoc açıklaması hakkında bir pasaj java.lang.Error:

    ... makul bir uygulamanın yakalamaya çalışmaması gereken ciddi sorunları belirtir.

    Bunun tersi java.lang.Exception, program yürütmesini sonlandırmadan bir programcı tarafından beklenen ve ele alınabilecek hataları temsil edecek şekilde tasarlanmıştır.

    Javadoc açıklaması hakkında bir pasaj java.lang.Exception:

    ... makul bir uygulamanın yakalamak isteyebileceği koşulları belirtir.

  • Arasındaki ikinci fark java.lang.Errorve java.lang.Exceptionilk bir olarak kabul kontrolsüz derleme zamanı istisna kontrolü için istisna. Sonuç kodu atma java.lang.Errorveya alt sınıfları, yöntem başlığında bu hatayı bildirmek zorunda değildir. java.lang.ExceptionYöntem başlığında gerekli bildirimi atarken .

Fırlatılabilir ve ardıl sınıf diyagramı (özellikler ve yöntemler atlanmıştır). resim açıklamasını buraya girin


1

IMO hatası, uygulamanızın başarısız olmasına neden olabilecek bir şeydir ve işlenmemelidir. Bir istisna, öngörülemeyen sonuçlara neden olabilecek, ancak kurtarılabilecek bir şeydir.

Misal:

Bir programın belleği dolduysa, uygulama devam edemediğinden bu bir hatadır. Ancak, bir program yanlış bir giriş türünü kabul ederse, program tarafından işlenebileceği ve doğru giriş türünü almak üzere yeniden yönlendirebileceği için bir istisnadır.


1

Hatalar çoğunlukla uygulamanın çalıştığı ortamdan kaynaklanır. Örneğin, OutOfMemoryError, JVM'nin belleği dolduğunda veya StackOverflowError, yığın taştığında oluşur.

İstisnalar çoğunlukla uygulamanın kendisinden kaynaklanır. Örneğin, bir uygulama null nesneye erişmeye çalıştığında NullPointerException oluşur veya bir uygulama uyumsuz sınıf türlerini yayınlamaya çalıştığında ClassCastException oluşur.

Kaynak: Java'da Hata Vs İstisnası Arasındaki Fark


"Hatalar çoğunlukla uygulamanın çalıştığı ortamdan kaynaklanır" ve "İstisnalar çoğunlukla uygulamanın kendisinden kaynaklanır" mükemmel!
ADJ

0

Java API'dan bir Hata ve Kural Dışı Durumun temsil ettiği oldukça iyi bir özet:

Hata, makul bir uygulamanın yakalamaya çalışmaması gereken ciddi sorunları gösteren Throwable'ın bir alt sınıfıdır. Bu tür hataların çoğu anormal durumlardır. ThreadDeath hatası, "normal" bir durum olsa da, çoğu uygulama tarafından yakalanmaya çalışılmaması gerektiği için bir Hata alt sınıfıdır.

Yöntemin yürütülmesi sırasında atılabilecek ancak yakalanamayan Hata alt sınıflarını çalıştırmak için bir yöntemin bildirilmesine gerek yoktur, çünkü bu hatalar asla oluşmaması gereken anormal durumlardır.

OTOH, İstisnalar için Java API diyor:

İstisna sınıfı ve alt sınıfları, makul bir uygulamanın yakalamak isteyebileceği koşulları gösteren bir Atılabilir biçimidir.


0

Hatalar, uygulamanızın veya programınızın çalıştığı ortamdan kaynaklanır. Çoğu zaman, uygulamanız veya programınız sona erdiğinden ondan kurtaramayabilirsiniz. Javadoc, JVM gibi ortamlarda bu tür hataları yine de bırakacağından bu tür hataları yakalamamanızı tavsiye etti.

Örnekler: VirtualMachineError- Java Sanal Makinesinin bozulduğunu veya çalışmaya devam edebilmesi için gerekli kaynakların tükendiğini belirtmek için atılmıştır. OutOfMemoryErrorJVM'nin belleği StackOverflowErrordolduğunda veya yığın bittiğinde oluşur.

İstisnalar uygulamanızın veya programınızın kendisinden kaynaklanır; belki kendi hatanız yüzünden. Çoğu zaman ondan kurtarabilirsiniz ve uygulamanız yine de çalışmaya devam eder. Uygulamanızın veya programınızın anormal olarak sonlandırılmasını önlemek ve / veya istisna mesajını özelleştirebilmek için bu tür hataları yakalamanız önerilir, böylece kullanıcılar her yere dağılmış varsayılan çirkin istisna mesajlar yerine güzel biçimlendirilmiş bir mesaj görürler.

Örnekler: NullPointerExceptionbir uygulama null nesneye erişmeye çalıştığında oluşur. veya Var olmayan bir dizine sahip bir diziye erişmeye çalışmak veya yanlış veri veya parametrelere sahip bir işlevi çağırmak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.