2009-08-14 34 views
6

Modülümün api'sinin, herhangi bir sorun olduğunda ve modül görevini yerine getiremediğinde yalnızca MyPackageSpecificException öğesini atmasını istiyorum. (Orijinal istisnası MyPackageSpecificException'ın nedeni olarak verilecektir).Süper/bu kurucuda atılan istisnalar, diğer istisnalar için çağrılıyor

Şimdi, bir kurucu için bir kaynağın yerini bulmak için bir parametre olarak bir URL'ye ihtiyacım vardı. URL yapıcısı MalformedURLException atar gibi ben yaparak MyPackageSpecificException içine sarmak istiyorum

public MyClass(String urlString) throws MalformedURLException{ 
    this(new URL(urlString)); 
} 

:

public MyClass(String urlString) throws MyPackageSpecificException{ 
    try{ 
     this(new URL(urlString)); 
    } catch (MalformedURLException e){ 
     throw new MyPackageSpecificException(e); 
    } 
} 
Ben de URL String temsil verilebilir hangi alternatif yapıcı yapmak istiyorum

Ancak, super() veya this() yapıcı çağrısı yapıcının ilk satırında olması gerektiğinden, yukarıdaki geçerli değildir.

Aynı sorun, super() veya this() yapıcısı başka bir şeye sarmak istediğim bir istisna atarsa ​​da geçerlidir.

Bunu nasıl çözmeliyim? Yoksa kötü bir uygulama yapmaya çalışıyorum mı?

yerine) (ortak bir init bu adres kullanmanın
public class MyClass 
{ 
    private URL url; 

    public MyClass(URL url) 
    { 
    this.url = url; 
    } 

    public MyClass(String urlString) throws MyPackageSpecificException 
    { 
    this(toURL(urlString)); 
    } 

    private static URL toURL(String urlString) throws MyPackageSpecificException 
    { 
    try 
    { 
     return new URL(urlString)); 
    } 
    catch (MalformedURLException e) 
    { 
     throw new MyPackageSpecificException(e); 
    } 
    } 
} 

cevap

6

: o kodunuzu uygunsa

+0

Bunu düşünmediğime inanamıyorum. Basit ve tam olarak istediğimi yapar. – Alderath

3

, bunun yerine statik bir yaratıcısı yöntemi kullanabilirsiniz URL argümanını bu şekilde yapıcının ilk satırı olmak zorunda kalmaz. Kabul cevabı sadece bulabilirseniz çalışır (ve "convert") olacaktır oysa o, jenerik durum için atmaz bir üst sınıf yapıcısı çalışacaktır çünkü

public MyClass(String url) throws MyPackageSpecificException 
{ 
    try 
    { 
    init(new URL(url)); 
    } 
    catch (MalformedURLException e) 
    { 
    throw new MyPackageSpecificException(e); 
    } 
} 

public MyClass(URL url) 
{ 
    init(url); 
} 

private void init(URL url) 
{ 
    // do constructor work here 
} 
+1

Bu, kabul edilen yanıt daha doğrusu iyidir istenmeyen istisnalar. Fabrika modeli FTW, sanırım. – Coderer

0

() yöntemini: Aşağıdaki deneyin

private MyClass(String urlString) { ... } 

public static MyClass createMyClass(String urlString) throws MyPackageSpecificException { 
    try { 
    new MyClass(urlString); 
    catch (Exception e) { 
    throw new MyPackageSpecificException(e); 
    } 
} 
+1

Bu, yapıcı parametrelerini son alanlara atamanızı engeller; bu da değişmez sınıflar oluşturmayı zorlaştırır. Son alanların atanması sadece kurucuda yapılabilir. –

+0

Gönderdiğim örnek için geçerli bir çözüm olmakla birlikte, bu, url bir süper kurucuya geçirilmesi gerektiğinde çalışmaz, bu yüzden diğer çözümleri tercih ederim. – Alderath