Dönüş boş; Bir istisna yakalanabileceğinden gereklidir, ancak böyle bir durumda, bunun boş olup olmadığını zaten kontrol ettiğimizden (ve klonlamayı desteklediğimizi çağırdığımız sınıfı bildiğimizi varsayalım), bu nedenle try ifadesinin asla başarısız olmayacağını biliyoruz.
İfadenin try
asla başarısız olamayacağını bildiğiniz bir şekilde ilgili girdilerle ilgili ayrıntıları biliyorsanız, buna sahip olmanın anlamı nedir? try
İşlerin her zaman başarılı olacağından eminseniz , kaçının (kod tabanınızın tüm ömrü boyunca kesinlikle emin olabileceğiniz nadirdir).
Her durumda, derleyici maalesef bir akıl okuyucusu değildir. İşlevi ve girdilerini görür ve sahip olduğu bilgiler verildiğinde return
, alt kısımdaki ifadeye sizinkine ihtiyaç duyar .
Yalnızca sözdizimini tatmin etmek ve derleme hatalarından kaçınmak için (buna ulaşılmayacağını açıklayan bir yorumla) ekstra return ifadesini sonuna koymak kötü bir uygulama mıdır, yoksa böyle bir şeyi kodlamanın daha iyi bir yolu var mı? return ifadesi gereksiz mi?
Tam tersine, başka bir kod satırına mal olsa bile herhangi bir derleyici uyarısından kaçınmanın iyi bir uygulama olduğunu öneririm. Buradaki satır sayısı hakkında fazla endişelenmeyin. Fonksiyonun güvenilirliğini test ederek oluşturun ve ardından devam edin. Sadece return
ifadeyi atlayabileceğinizi varsayarak , bir yıl sonra o koda geri döndüğünüzü hayal edin ve ardından return
alttaki bu ifadenin, yapabileceğiniz varsayımlar nedeniyle neden atlandığına dair küçük ayrıntıların ayrıntılarını açıklayan bazı yorumlardan daha fazla kafa karışıklığına neden olup olmayacağına karar vermeye çalışın. girdi parametreleri hakkında bilgi verin. Büyük olasılıkla return
ifadenin üstesinden gelmek daha kolay olacak.
Bununla birlikte, özellikle bu bölüm hakkında:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
Buradaki istisnaları ele alma zihniyetinde biraz tuhaf olduğunu düşünüyorum. Genelde, yanıt olarak yapabileceğiniz anlamlı bir şeyin olduğu bir sitede istisnaları yutmak istersiniz.
try/catch
Bir işlem mekanizması olarak düşünebilirsiniz . try
bu değişiklikleri yapmak, başarısız olurlarsa ve catch
bloğa dallanırsak catch
, geri alma ve kurtarma sürecinin bir parçası olarak yanıt olarak bunu ( blokta ne varsa ) yapın.
Bu durumda, yalnızca bir yığın izleme yazdırmak ve ardından boş döndürmeye zorlanmak tam olarak bir işlem / kurtarma zihniyeti değildir. Kod, hata işleme sorumluluğunu getClone
hataları manuel olarak kontrol etmek için çağıran tüm koda aktarır . Yakalamayı tercih edebilirsinizCloneNotSupportedException
ve başka, daha anlamlı bir istisna biçimine çevirmeyi ve atmayı tercih edebilirsiniz, ancak istisnayı basitçe yutmak ve bu durumda bir işlem kurtarma sitesi gibi olmadığından bir boş döndürmek istemezsiniz.
Bir istisna atmak bundan kaçınırken, başarısızlıkla bu şekilde manuel olarak kontrol etme ve başa çıkma sorumluluklarını arayanlara sızdırırsınız.
Sanki bir dosya yüklerseniz, bu üst düzey işlemdir. try/catch
Orada olabilir . trying
Dosya yükleme işlemi sırasında nesneleri klonlayabilirsiniz. Bu üst düzey işlemin herhangi bir yerinde bir hata varsa (dosyayı yüklerken), genellikle bu üst düzey işlem try/catch
bloğuna tüm yol boyunca istisnalar atmak istersiniz, böylece bir dosyanın yüklenmesindeki bir başarısızlıktan (ister klonlamadaki bir hata veya başka bir şey nedeniyle). Bu nedenle, genellikle bunun gibi granüler bir yerde bir istisnayı yutup sonra bir boş döndürmek istemeyiz, örneğin bu istisnaların birçok değerini ve amacını ortadan kaldırır. Bunun yerine, istisnaları, onunla anlamlı bir şekilde başa çıkabileceğimiz bir siteye kadar yaymak istiyoruz.
Object
parametre alır . Eğera
destekleyen bir sınıf değildirclone
yöntemi (veya bu tanımlanırObject
?) Veya bir hata sırasında oluşursaclone
yöntemiyle (veya şu anda düşünemiyorum başka bir hata), bir özel durum olabilir ve siz ulaşacak dönüş ifadesi.