在构造函数中使用try / catch调用另一个构造函数

时间:2013-11-04 17:36:02

标签: java oop exception-handling constructor

我遇到了使用默认构造函数的参数调用构造函数的问题。

   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;
             }
    }

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

写这篇文章:chaining constructors in Java without throwing exceptions from the default constructor

我可以选择将try / catch放在另一个方法中。但还有其他方法吗? P.S:我不想使用'throws'

2 个答案:

答案 0 :(得分:0)

选项1 :将另一个构造函数传递给属性的新空实例:

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

  // rest of code...
}

选项2 :将另一个构造函数传递给属性的null实例。然后你必须在load(...)中防范null,但你可能应该是:

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)

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