RuntimeException oluşturan yöntemler, yöntem imzasında bunu belirtmeli mi?


86

Örneğin, çerçevelerdeki / JDK'daki birçok yöntem,

java.lang.SecurityException 

ancak bu, yöntem imzasında belirtilmez (çünkü bu normalde kontrol edilen istisnalar için ayrılmış bir uygulamadır). Yöntem sigs'lerinde RuntimeExceptions bildirmenin birçok faydası olduğunu iddia etmek istiyorum (örneğin, statik tür kontrolüne benzer). Sarhoş muyum yoksa başka şekilde mi?

Yanıtlar:


70

İmzada denetlenmemiş bir istisna beyan etmem, çünkü bu API'nin kullanıcısını yanıltıcıdır. İstisnanın açıkça ele alınmasının gerekip gerekmediği artık açık değildir.

Bunu javadoc'ta beyan etmek daha iyi bir yaklaşımdır, çünkü birisinin gerekli olduğunu düşündüğünde onu halletmesine izin verir, ancak isterse görmezden gelebileceğini bilir. Bu, işaretli ve işaretsiz arasındaki ayrımı netleştirir.


4
Java derleyicisi sizi bildirilen RuntimeExceptions'ı işlemeye zorlamaz. Böylece bunları geliştiriciler için bir "ipucu" olarak ilan edebilirsiniz. JavaDoc bunun için daha iyi bir yer olup olmadığı tartışılabilir. İşaretlenmiş ve işaretlenmemiş İstisnalar ile ilgili nokta önemlidir. İşaretli ve işaretlenmemiş İstisnalar, Java'nın (Derleme Süresi-) İstisnalar (işaretli) ve Çalışma Zamanı İstisnaları (işaretlenmemiş) ile gerçekte ne anlama geldiğidir.
Guardian667

6
İlkbaharda yöntem imzasında denetlenmemiş istisnaların bildirilmesi yaygın bir uygulama olmaya başladı.
johnlemon

39

Gönderen Oracle Java öğretici :

"Bir yöntemin API'sini, atabileceği istisnalar da dahil olmak üzere belgelemek o kadar iyiyse, neden çalışma zamanı istisnalarını da belirtmiyorsunuz?" Çalışma zamanı istisnaları, bir programlama probleminin sonucu olan sorunları temsil eder ve bu nedenle, API istemci kodunun bunlardan kurtarması veya herhangi bir şekilde işlemesi makul bir şekilde beklenemez. Bu tür sorunlar arasında sıfıra bölme gibi aritmetik istisnalar; boş bir başvuru yoluyla bir nesneye 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 endeksleme istisnaları.

Çalışma zamanı istisnaları bir programın herhangi bir yerinde meydana gelebilir ve tipik bir programda çok sayıda olabilir. Her yöntem bildirimine çalışma zamanı istisnaları eklemek zorunda kalmak, bir programın netliğini azaltır.


Bu nedenle, derleyici, çalışma zamanı istisnalarını yakalamanızı veya belirtmenizi gerektirmez (ancak yapabilirsiniz).
johnlemon

18

Koleksiyon # add için javadoc'a bir göz atın

Bahsedilen çok sayıda kontrol edilmemiş istisna var:

Throws:
UnsupportedOperationException - add is not supported by this collection.
ClassCastException - class of the specified element prevents it from being added to this collection.
NullPointerException - if the specified element is null and this collection does not support null elements.
IllegalArgumentException - some aspect of this element prevents it from being added to this collection.

Sabrınız varsa, yöntemleriniz tarafından atılan olası istisnaları bu şekilde ayrıntılı bir şekilde belgelemenizi tavsiye ederim. Bir bakıma, bunu kontrol edilmeyen istisnalar için yapmak daha da önemlidir, çünkü kontrol edilen istisnalar bir şekilde kendi kendini belgelendirir (derleyici çağıran kodu onları kabul etmeye zorlar).


6
Bu cevap yanlış. throwsYöntem imzasında hakkında soru sorulduğunda Javadoc ifadelerinden bahsediyorsunuz . Bunlar aynı şey değil. Evet, kesinlikle gereken API'nızdan tarafından atılan tüm istisnalar belgelemek, ama soru o değil.
Gili

8

Benim bakış açıma göre, en azından yöntem için javadoc'da çalışma zamanı istisnalarını bildirmek daha iyidir. Bunu imzada beyan etmek, bir şeyler ters gittiğinde neler olabileceğini daha da açık hale getirir. Bu bilgileri sağlamayı önermemin ana nedeni budur.

Bilginize: Zaman ilerledikçe (şimdi 2017'de) şimdi bunları yalnızca javadoc ile belgelemeye ve kontrol edilen istisnalardan mümkün olduğunca kaçınmaya daha çok eğiliyorum.


3

Benim görüşüme göre, kontrol edilmeyen istisnalar, doğalarına aykırı olduğu için asla yöntem imzasında beyan edilmemelidir.

Bununla birlikte, bir yöntemin Javadoc'ta @throws'daki olası koşullara dikkat ederek bazı kontrol edilmemiş istisnalar atması muhtemelse, neyin yanlış gidebileceğini anlamada yöntemi kullanan diğerlerine yardımcı olabilir. Bu, yalnızca arayanların işleyebileceği istisnalar için kullanışlıdır (örneğin, hatalı giriş nedeniyle NPE vb.)


3

Başkaları tarafından kullanılmak üzere bir api yazıyorsanız, amacınızın api'de açık bir şekilde belgelenmesi için yeterli neden vardır ve yöntem imzasında RuntimeExceptions bildirmenin dezavantajı yoktur.


1

Bu, kontrol edilen istisnalara ilişkin tartışmayla ilgilidir . Çoğu kişi, istisnaların yöntem imzalarında belirtilmemesi gerektiği konusunda hemfikirdir.

Çalışma zamanı istisnalarının nasıl kullanılması gerektiğine dair bir tartışma da var . Çalışma zamanı istisnalarının bir programlama hatasını veya ölümcül bir durumu göstermesi gerektiği konusunda bir gönderene katılıyorum. Yani onları imzada beyan etmenin pek bir değeri yok. Her yöntem potansiyel olarak birinden geçebilir.


Bir ayrıştırma istisnası veya başka bir veri doğrulama türü istisnası o zaman nereye uyar? İşaretli istisnaları kullanmamalısınız, ancak daha sonra kontrol edilmemiş istisnaların ne için kullanılacağını sınırlamanız gerektiğini ima ediyorsunuz.
Robin

1
Demek istediğim, geliştiricinin kontrol edilen istisnaları yakalamaya zorlanmaması gerektiğidir. Dolayısıyla, onları yöntem imzasında bildirmeye gerek yoktur. Java'da, bunları Spring'in yaptığı gibi çalışma zamanı istisnalarında dönüştürebilirsiniz. Ayrıca, çalışma zamanı istisnalarının yalnızca kurtarılamayan durumlarda atılması gerektiğini söylüyorum.
kgiannakakis
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.