2013-11-04 175 views
0

我有一个调用具有默认构造函数参数的构造函数的问题。使用try/catch内部调用另一个构造函数的构造函数

Class A {    
      private static Properties properties; 

      A(Properties property){ 

       // do some checks 
        try{ 
         load(property, fileName) 
        } catch(IOException e) { 
         throw new RuntimeException(); 
        } 
       } 

      A(){ 
        this(load(properties)); 
       } 

      private static Properties load(Properties properties, String fileName) throws IOException { 
       try { 
        properties.load(A.class.getClassLoader() 
          .getResourceAsStream(fileName)); 
        } catch (IOException ioException) { 
        throw new IOException("Unable to process the properties File. " + fileName, ioException); 
        } 

       return properties; 
      } 
    } 

我的问题是:在默认的构造函数中,我想使用try/catch块,并执行抛出运行时异常的相同操作。你能帮我解决这个问题吗?

WRT这个帖子:chaining constructors in Java without throwing exceptions from the default constructor

我把try/catch语句内的另一个方法的选择。但有没有其他方法? PS:我不想用“抛出”

+0

你究竟在做什么?你能清理一下你的文章吗? –

+0

我试图有两个构造函数。一个带有参数和一个,默认值。如果我的类的使用者没有调用参数构造函数,那么我需要自动加载并将其传递给带有参数的构造函数 – Vikram

+0

发布加载函数 – Joel

回答

0

选项1:通过其他的构造属性的一个新的空实例:

class A 
{ 
    public A() 
    { 
    this(new Properties()); 
    } 

    // rest of code... 
} 

选项2:传给其他构造一个空属性实例。然后你必须警惕空在load(...),但你可能应该是无论如何:

class A 
{ 
    public A() 
    { 
    this(null); 
    } 

    // rest of code... 
} 

选项3:通过其他的构造属性的默认实例:

class A 
{ 
    private static final Properties defaultProperties; 
    static 
    { 
    defaultProperties = new Properties(); 
    // populate here however you wish 
    } 

    public A() 
    { 
    this(defaultProperties); 
    } 

    // rest of code... 
} 
+1

可能要将最终关键字添加到静态字段 –

+0

@SamiKorhonen +1 – splungebob

0

Java那样不允许将链式构造函数调用包含在try块中,因为如果没有限制,此类构造可以允许其基础对象抛出异常的对象最终返回到调用代码。这使得难以表达涉及诸如文件之类资源的某些概念[例如有一个构造函数在链接到父项并在之后关闭它之前打开一个文件会很有帮助,但是没有办法安全地让构造函数对在链接到父项之前打开的文件负责]。 Java中最好的方法是避免可能会抛出异常的公共构造函数,而是使用可以更好地处理它们的工厂方法。

相关问题