Java.lang.RuntimeException ve java.lang.Exception arasındaki fark


210

Birisi lütfen java.lang.RuntimeExceptionve java.lang.Exception? Arasındaki farkı açıklar. Kendi istisnamı yaratırsam hangisinin genişletileceğine nasıl karar verebilirim?

Yanıtlar:


181

Genellikle RuntimeExceptions , programlı olarak önlenebilecek istisnalardır . Örneğin NullPointerException, ArrayIndexOutOfBoundException. Herhangi nullbir yöntemi çağırmadan önce kontrol ederseniz , NullPointerExceptionasla gerçekleşmez. Benzer şekilde ArrayIndexOutOfBoundException, önce dizini kontrol ederseniz asla gerçekleşmez. RuntimeExceptionderleyici tarafından kontrol edilmez, bu yüzden temiz koddur.

EDIT : Bugünlerde insanlar RuntimeExceptiontemiz kod ürettiği için tercih. Tamamen kişisel bir seçimdir.


10
"Çalışma zamanı istisnaları arayan tarafından kaçınılmış olabilir" bu açısı gibi. Bu, (bir yöntemin arayanı olarak) bunların gerçekleşmediğinden emin olmanız gerektiği anlamına gelir. Oysa kontrol edilen istisnalar, kaçınamayacağınız bir şeydir ve bunun yerine onlarla başa çıkmanız gerekir. (Ve evet, herkes kontrol edilen istisnalar konseptini kabul etmediği ve birçok kişi her şey için RuntimeException kullandığından, bu ayrım biraz karışık hale geldi).
Thilo

4
Günümüzde insanlar işaretlenmemiş RuntimeException'ı tercih ediyorlar, çünkü Java 8 Lambda işlemeyle uyumludur, oysa Exception türünde kontrol edilen istisnalar değildir.
Hartmut P.

2
İnsanların yakalamasının gerçek nedeninin RuntimeExceptionbasit olması ve şüpheli ve kontrol edilen ve kontrol edilmeyen istisnalar arasındaki farkları düşünme gereğini ortadan kaldırdığından şüpheleniyorum . Çalışma zamanı istisnalarını yakalamak korkunç bir fikir olduğunu düşünüyorum, çünkü kurtarılamaz istisnaları yakalayacaksınız NullPointerException.
Dónal

186

Java'da iki tür istisna vardır: işaretli istisnalar ve işaretsiz istisnalar. İşaretli bir istisnanın kod tarafından açıkça işlenmesi gerekirken, işaretli olmayan bir istisnanın açıkça işlenmesi gerekmez.

İşaretli özel durumlar için, yöntemin bu tür bir özel durum ( çağrı sınıfında veya üstünde).

"Exception" öğesinden türeyen herhangi bir özel durum işaretli bir istisnadır, RuntimeException öğesinden türetilen bir sınıf işaretlenmez. RuntimeExceptions öğesinin arama kodu tarafından açıkça işlenmesi gerekmez.


3
Pratik olarak "iki tür istisna vardır" doğrudur, ancak Oracle belgeleri neden üç tür olduğunu söylüyor. Hatayı 3. tür olarak kabul eder. Bence, Hata hiç bir istisna değildir, sadece Atılabilir (nesne), evet, çalışma zamanı istisnalarının davranışını taklit eder. Bununla ilgili ne söylerdiniz? Oracle dok. ref. docs.oracle.com/javase/tutorial/essential/exceptions/…
Asif Shahzad

3
Bir Hata yakalanmaya yönelik değildir (ancak olsa da), yeni kod üzerinde çalışırken genellikle kendi hatalarınızı yakalamak için hatalar kullanırsınız. Örneğin, eğer if / elseif ifadesi varsa bir ağacınız varsa, son başka yalnızca Error ("bu koşulun gerçekleşmesini beklemiyordum"); Genel olarak konuşursak, istisnalar söz konusu oldukları durumlar için kullanılırken hataların kullanım durumu yoktur ve bunlar bir hatadır.
Danny

5
Ancak şaka RunTimeException'ın kendisi İstisna: D (bunun herhangi bir sorun yaratmadığını ve JVM'nin tüm bağlamı hallettiğini biliyorum)
Alireza Mohamadi

94

java.lang.RuntimeExceptionVe java.lang.Exceptionsınıflar arasındaki farka bakmadan önce , Exceptionhiyerarşiyi bilmelisiniz . Hem Exceptionve Errorsınıflar sınıftan türetilir Throwable( sınıftan türetilir Object). Ve sınıf sınıftan RuntimeExceptiontüretilir Exception.

Tüm durumlar arasından ya türetilir Exceptionya da RuntimeException.

Kaynaklanan tüm istisnalar kontrol edilmemiş istisnalar RuntimeExceptionolarak adlandırılır . Ve diğer tüm istisnalar kontrol edilen istisnalardır. İşaretli bir istisna kodunuzun herhangi bir yerine takılmalıdır, aksi takdirde derlenmez. Bu nedenle kontrol edilmiş istisnalar denir. Öte yandan, denetlenmeyen istisnalar dışında, çağrı yönteminin bunu ele alma veya beyan etme zorunluluğu yoktur.

Bu nedenle, derleyicinin sizi işlemeye zorladığı tüm özel durumlar doğrudan türetilmiştir java.lang.Exceptionve derleyicinin sizi işlemeye zorlamadığı diğer tüm durumlar da türetilmiştir java.lang.RuntimeException.

Aşağıda, RuntimeException öğesinin doğrudan bilinen bazı alt sınıfları bulunmaktadır .

AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException 

47

Bir Kural Dışı Durum işaretlenir ve bir RuntimeException seçeneği işaretlenmez.

İşaretli, derleyicinin özel durumu bir yakalamada ele almanızı veya yönteminizi atma (veya üst sınıflarından biri) olarak bildirmesini gerektirdiği anlamına gelir.

Genel olarak, API arayanın istisnayı işlemesi bekleniyorsa işaretli bir istisna ve arayanın parametrelerden birindeki bir hata, örneğin bir programlama gibi normal olarak işleyemeyeceği bir şeyse işaretlenmeyen bir istisna atayın hata.


15

Çalışma zamanı özel durum sınıfları (RuntimeException ve alt sınıfları) derleme zamanı denetiminden muaftır, çünkü derleyici çalışma zamanı özel durumlarının oluşamayacağını belirleyemez. (JLS'den).

Tasarladığınız sınıflarda İstisnai durumları alt sınıflara ayırmalı ve istisnai senaryoları bildirmek için örneklerini atmalısınız . Bunu yaptığınızda, sınıfınızdaki müşterilere, sınıfınızın kullanımının istisna oluşturabileceğini ve bu istisnai senaryoları ele almak için adımlar atmaları gerektiğini açıkça işaret edeceksiniz.

Aşağıdaki kod parçacıkları bu noktayı açıklar:

//Create your own exception class subclassing from Exception
class MyException extends Exception {
    public MyException(final String message) {
        super(message);
    }
}

public class Process {
    public void execute() {
        throw new RuntimeException("Runtime");
    }  
    public void process() throws MyException {
        throw new MyException("Checked");
    }
}

Sınıf yukarıdaki sınıf tanımda Süreci , yöntem executebir atabilir RuntimeException ancak yöntem bildirimi ihtiyacı o atar belirtmek değil RuntimeException .

Yöntem process, denetlenen bir özel durum atar ve denetimli bir MyException özel durumunu atacağını ve bunu yapmamak derleme hatası olacağını bildirmelidir.

Yukarıdaki sınıf tanımı Process sınıfını kullanan kodu da etkiler .

Çağrı new Process().execute()formunun çağrı gibi geçerli çağırma olan new Process().process()bir derleme hatası verir. Bunun nedeni, istemci kodunun MyExceptionişlenmesi için adımlar atması gerektiğidir (bir call / catch bloğuna eklenebilir).


13

RuntimeException'ın doğru kullanımı?

Gönderen İşaretli İstisnalar - Tartışmanın :

Bir istemcinin bir istisnadan kurtarması makul olarak isteniyorsa, denetlenen bir istisna yapın. İstemci özel durumdan kurtarmak için hiçbir şey yapamazsa, denetlenmeyen bir özel durum haline getirin.

İşaretlenmeyen bir kural dışı durumun türetildiğini RuntimeExceptionve denetlenen kural dışı durumun türetildiğini unutmayın Exception.

RuntimeExceptionİstemci istisnadan kurtarmak için hiçbir şey yapamıyorsa neden atar ? Makale açıklıyor:

Çalışma zamanı istisnaları, bir programlama sorununun sonucu olan sorunları temsil eder ve bu nedenle, API istemci kodunun onlardan kurtarılması veya bunları herhangi bir şekilde işlemesi beklenemez. Bu tür sorunlar arasında sıfıra bölme gibi aritmetik istisnalar; bir nesneye boş bir başvuru yoluyla erişmeye çalışmak gibi işaretçi istisnalar; ve çok büyük veya çok küçük bir dizin aracılığıyla bir dizi öğesine erişmeye çalışmak gibi dizin oluşturma istisnaları.


5

Oracle Belgelerinden:

Alt satırdaki kılavuz şudur: Bir istemcinin bir istisnayı kurtarması beklenebiliyorsa, denetlenen bir istisna yapın. İstemci özel durumdan kurtarmak için hiçbir şey yapamazsa, denetlenmeyen bir özel durum haline getirin.

Çalışma zamanı istisnaları, bir programlama sorununun sonucu olan sorunları temsil eder ve bu nedenle, API istemci kodunun onlardan kurtarılması veya herhangi bir şekilde işlemesi beklenemez.

RuntimeExceptions, "api'nin geçersiz kullanımından özel durumlar" gibi runtimeexceptions örnekleri: IllegalStateException, NegativeArraySizeException, NullpointerException

İstisnalar ile bunu açıkça yakalamanız gerekir, çünkü hala kurtarmak için bir şeyler yapabilirsiniz. İstisnalara örnekler: IOException, TimeoutException, PrintException ...


4

Basit bir deyişle, istemciniz / kullanıcınız İstisnadan kurtarabilirse, bunu bir Kontrol Edilmiş İstisna yapın , istemciniz İstisna'dan kurtarmak için hiçbir şey yapamazsa, bunu Kontrol Edilmemiş RuntimeException yapın . Örneğin, bir RuntimeException sıfıra bölme gibi programlı bir hata olurdu, hiçbir kullanıcı programcıdan başka bir şey yapamaz, o zaman bir RuntimeException'dır .


3

RuntimeException, Exception sınıfının alt sınıfıdır

Bu, İstisna sınıfının birçok alt sınıfından biridir. RuntimeException, Java Sanal Makinesi'nin normal çalışması sırasında atılabilecek özel durumların üst sınıfıdır. RuntimeException öğesinin, yöntemin yürütülmesi sırasında atılabilecek ancak yakalanamayan tüm yan tümceleri tümceleri için deyim belirtmesi gerekmez.

Hierchy

java.lang.Object

--- java.lang.Throwable

------- java.lang.Exception

------------- java.lang.RuntimeException


0

İstisnalar, uygulama akışınızdaki beklenmedik olayları ele almanın iyi bir yoludur. RuntimeException Derleyici tarafından işaretlenmemişse de, API istemcilerinizin derlemeleri için hataları yakalamaları gerektiği için davranışlarını denetlemek üzere Exception Class'ı genişleten Özel Durumlar'ı kullanmayı tercih edebilirsiniz. Ayrıca iyi belgeler oluşturur.

Temiz bir arabirim elde etmek istiyorsanız, uygulamanızın sahip olduğu farklı istisna türlerini alt sınıflara ayırmak için kalıtım kullanın ve ardından üst istisnayı ortaya çıkarın.


0

İki tür istisna vardır, böyle bir istisna alırsanız işaretli istisnayı kurtarabilirsiniz. Çalışma zamanı istisnası geri alınamaz, çalışma zamanı istisnaları programlama hatalarıdır ve programcı kodu yazarken buna dikkat etmelidir ve bunun yürütülmesine devam etmeniz size yanlış sonuç verebilir. Çalışma zamanı istisnaları, ön koşulu ex ihlal etmekle ilgilidir. 10 boyutlu bir diziniz var ve 11. öğeye erişmeye çalışıyorsanız, ArrayIndexOutOfBoundException


0
  1. Kullanıcı tanımlı İstisna Kontrol Edilebilir İstisna veya Kontrol Edilmemiş İstisna, Genişletildiği sınıfa bağlıdır.

  2. Kullanıcı tanımlı İstisna, İstisna sınıfına genişletiliyorsa Özel Kontrol Edilen İstisna olabilir

  3. Kullanıcı tanımlı İstisna, Çalışma zamanı İstisna sınıfına genişletiliyorsa Özel İşaretsiz İstisna olabilir.

  4. Bir sınıf tanımlayın ve İstisna veya Çalışma Zamanı İstisnası için alt öğe yapın

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.