2016-11-22 18 views
5
public void throwTest() throws SQLException, IOException { 
    try{ 
    } catch (SQLException e) { 
    } 
} 

Neden olduğunu ben herhangi İstisna atabilir, oysa bir derleme hatası verecektir occurr olmayacak bir istisna yakalamaya çalışıyor, bu vermeyecektir olduğunu yakalamak olmayan bir meydana istisna ama olamaz bir hata? Her ikisi de derleme zamanında kontrol edilebilir, bu yüzden davranış aynı ise, sadece benim için daha anlamlı olur? hata: istisna SQLException try ifadesi } catch (SQLException e) {Neden bunu

tekabül gövdesinde atılmış asla ben kaldırmak Verilen örnekte

, Catch bloğu bir derleme zamanı hatası oluşturur blok yakalamak, kod sadece iyi derler. Bu benim için tutarsız görünüyor. Bu davranış için belirli bir neden var mı?

+0

Potansiyel yineleme [Java erişilemez catch bloğu derleyici hatası] (http://stackoverflow.com/a/5899901/2127492) – jrbeverly

+1

Soru, derleme hatasıyla ilgili değil, atışın davranışı ile yakalama davranışı arasındaki farkla ilgilidir. Bu durumda, bu bir yinelenen soru değil – ExaSephiroth

+1

olduğuna inanıyorum Doğru olduğunu gözden, bu bir yinelenen bir soru değildir. Benim hatam ve özür dilerim. – jrbeverly

cevap

3

Yakalama, derleme zamanında belirlenebilir. Bir atama bildirimi, geçerli yöntemde aslında atılmaz, ancak bazı alt sınıfların yönteminde geçersiz kılındı. Sınıfın çocuk sınıfları şeklinde kullanılması için bir sözleşmedir: bu istisnayı fırlatabilir ve bununla başa çıkmak zorunda kalabilir. Ayrıca, çocuk sınıfının bu yöntemi atmasını sağlayan yönteme de izin verir.

+0

Ayrıca, gelecekteki sürümlerde bir istisna atmasına da izin veriyor. – shmosel

+0

Bu gerçekten mükemmel bir cevap, çok teşekkürler (soru şu anda çift olarak işaretlendiğinden, cevabınızı kabul edemiyorum). – ExaSephiroth

+0

@ExaSephiroth Yeniden açıldı. – chrylis

2

Sorunuzun anlıyorum ama bir bıçak alacağım emin değilim. Derleyici bir hatadan kaçınmanıza yardımcı olmaya çalışıyor. Deneme bloğunuzda SQLException'ı attıran bir kodunuz varsa ancak catch bloğunuzda bir yazım hatası varsa ve SLQException'ı yakaladıysanız, derleyicinin bu hatayı işaretlemesini istersiniz. Bu yüzden bir hata olarak işaretler, yakaladığınız istisna asla atılmaz. Eğer olursa olsun yöntem aslında bu istisna atar mı yönteminiz beyanının maddesini atar içinde istediğini koymak için izin verilir, neden

Ben, sorunun ikinci bölümü olduğunu düşünüyorum? Sanırım iki sebep var. İlk olarak, yöntem bildirimi bir arabirimdir ve istemcilere nasıl kod yazılacağını söyler. Yöntem gövdesini tamamlamadan önce yöntem bildirimini kurabilir ve iş arkadaşlarınız için kullanılabilir hale getirebilirsiniz. Yani bu durumda, bir hata değil, sadece devam eden bir çalışma. İkincisi, sınıfınız, yöntemi istisna attığını ilan eden bir arabirimi uygulayabilir, ancak özel uygulamanızda atmanıza gerek yoktur. Yine, bu bir hata değil.

+0

* Yöntem bildirimini ayarlayabilir ve yöntem gövdesini tamamlamadan önce iş arkadaşlarınız için kullanılabilir hale getirebilirsiniz. Gelecekteki değişikliklere izin vermekle ilgili olduğu gibi, yöntem gövdesini tamamlama hakkında çok fazla. Önemli olan, imzanın, açıkladığınız gibi, müşteriye bir sözleşme olmasıdır. İkincisi, sınıfınız, yöntemi istisna attığını ilan eden bir arabirimi uygulayabilir, ancak özel uygulamanızda atmanıza gerek yoktur. * Bu durumda, yöntemin istisnayı bildirmesi gerekmez. – shmosel

+0

Üzgünüm, soru açık değildi. Temel soru, atma ve yakalama bloğu arasındaki davranışın neden aynı olmadığıydı. Ve aslında, davranıştaki farklılık için çok iyi bir sebep olan, aşırıya kaçan davranışları düşünmedim. – ExaSephiroth