Yukarıdakiler kontrol edilmiş bir istisna olarak kabul edilir mi? Hayır Bir istisna kullanımı vardır aslında bu bir yapmaz Checked Exception
o ise RuntimeException
.
Mı RuntimeException
bir unchecked exception
? Evet
Checked Exceptions
Hangi subclasses
ait java.lang.Exception
Unchecked Exceptions
olan subclasses
birjava.lang.RuntimeException
İşaretli istisnaları atan aramaların bir try {} bloğuna eklenmesi veya yöntemin arayanında yukarıdaki bir seviyede ele alınması gerekir. Bu durumda, mevcut yöntem, arayanların istisna ile başa çıkmak için uygun düzenlemeleri yapabilmesi için bahsedilen istisnaları attığını beyan etmelidir.
Bu yardımcı olur umarım.
S: Tam istisnayı patlatmalı mıyım yoksa İstisna kullanarak maskeli mi?
A: Evet bu çok iyi bir soru ve önemli tasarım dikkate. İstisna sınıfı çok genel bir istisna sınıfıdır ve dahili düşük seviyeli istisnaları sarmak için kullanılabilir. Özel bir istisna oluşturup içine sarmanız daha iyi olur. Ama, ve büyük bir - Asla altta yatan orijinal kök neden asla belirsiz. Örneğin, Don't ever
aşağıdakileri yapın -
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException("Cannot login!!"); //<-- Eat away original root cause, thus obscuring underlying problem.
}
Bunun yerine aşağıdakileri yapın:
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException(sqle); //<-- Wrap original exception to pass on root cause upstairs!.
}
Özgün kök nedenini ortadan kaldırmak, iyileşmenin ötesindeki asıl sebebi, üretim destek ekipleri için, erişim verilen tüm uygulama günlükleri ve hata mesajları olduğu bir kabus. İkincisi daha iyi bir tasarım olmasına rağmen, birçok kişi bunu sık sık kullanmaz, çünkü geliştiriciler sadece altta yatan mesajı arayan kişiye iletemez. Bu yüzden kesin bir not alın: Always pass on the actual exception
Uygulamaya özgü herhangi bir istisna dışında olsun ya da olmasın.
Denemede RuntimeExceptions
RuntimeException
Genel bir kural olarak denememelisiniz. Genellikle bir programlama hatasına işaret ederler ve yalnız bırakılmalıdırlar. Bunun yerine programcı, a ile sonuçlanabilecek bazı kodları çağırmadan önce hata durumunu kontrol etmelidir RuntimeException
. Örneğin:
try {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welcome to my site!);
} catch (NullPointerException npe) {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
Bu kötü bir programlama uygulamasıdır. Bunun yerine bir null kontrol yapılmalıydı -
if (userObject != null) {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welome to my site!);
} else {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
Ancak, sayı biçimlendirme gibi böyle bir hata kontrolünün pahalı olduğu zamanlar vardır, bunu düşünün -
try {
String userAge = (String)request.getParameter("age");
userObject.setAge(Integer.parseInt(strUserAge));
} catch (NumberFormatException npe) {
sendError("Sorry, Age is supposed to be an Integer. Please try again.");
}
Burada, çağırma öncesi hata denetimi çabaya değmez, çünkü esas olarak parseInt () yöntemi içindeki tüm dizeden tamsayı dönüşüm kodunu çoğaltmak anlamına gelir - ve bir geliştirici tarafından uygulanırsa hataya açıktır. Yani try-catch ile ortadan kaldırmak daha iyidir.
Yani NullPointerException
ve NumberFormatException
her ikisi de RuntimeExceptions
, hata eğilimli kod olası giriş önlemek NullPointerException
için NumberFormatException
açıkça yakalamak tavsiye ederken bir zarif yakalamak null-check ile değiştirilmesi gerekir .
DataSeries
zaman zamana bağlı sırada kalması gereken verileri tutan bir sınıfım var. A'nınDataPoint
sonuna yeni eklemek için bir yöntem vardırDataSeries
. Kodumun tamamı proje boyunca doğru çalışıyorsaDataPoint
, sonuna zaten bitiş tarihi olan bir tarihe asla sonuna eklenmemelidir. Tüm projedeki her modül bu gerçekçilik ile inşa edilmiştir. Ancak, bu koşulu kontrol ediyorum ve eğer olursa kontrolsüz bir istisna atarım. Neden? Eğer olursa, bunu kimin yaptığını bilmek ve düzeltmek istiyorum.