Yanıtlar:
Genellikle RuntimeExceptions , programlı olarak önlenebilecek istisnalardır . Örneğin NullPointerException
, ArrayIndexOutOfBoundException
. Herhangi null
bir yöntemi çağırmadan önce kontrol ederseniz , NullPointerException
asla gerçekleşmez. Benzer şekilde ArrayIndexOutOfBoundException
, önce dizini kontrol ederseniz asla gerçekleşmez. RuntimeException
derleyici tarafından kontrol edilmez, bu yüzden temiz koddur.
EDIT : Bugünlerde insanlar RuntimeException
temiz kod ürettiği için tercih. Tamamen kişisel bir seçimdir.
RuntimeException
basit 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
.
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.
java.lang.RuntimeException
Ve java.lang.Exception
sınıflar arasındaki farka bakmadan önce , Exception
hiyerarşiyi bilmelisiniz . Hem Exception
ve Error
sınıflar sınıftan türetilir Throwable
( sınıftan türetilir Object
). Ve sınıf sınıftan RuntimeException
türetilir Exception
.
Tüm durumlar arasından ya türetilir Exception
ya da RuntimeException
.
Kaynaklanan tüm istisnalar kontrol edilmemiş istisnalar RuntimeException
olarak 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.Exception
ve 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
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.
Ç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 execute
bir 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 MyException
işlenmesi için adımlar atması gerektiğidir (bir call / catch bloğuna eklenebilir).
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 RuntimeException
ve 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ı.
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 ...
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 .
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
İ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.
İ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
Kullanıcı tanımlı İstisna Kontrol Edilebilir İstisna veya Kontrol Edilmemiş İstisna, Genişletildiği sınıfa bağlıdır.
Kullanıcı tanımlı İstisna, İstisna sınıfına genişletiliyorsa Özel Kontrol Edilen İstisna olabilir
Kullanıcı tanımlı İstisna, Çalışma zamanı İstisna sınıfına genişletiliyorsa Özel İşaretsiz İstisna olabilir.
Bir sınıf tanımlayın ve İstisna veya Çalışma Zamanı İstisnası için alt öğe yapın