如何在方法外使用对象的构造函数实例化对象 java

How to instantiate an object using it's constructor outside a method java

我想在方法之外用它的构造函数实例化一个对象。示例:

public class Toplevel {

   Configuration config = new Configuration("testconfig.properties");

   public void method1() {

      config.getValue();
      ...etc
   }
}

如果我现在这样做...我会收到此错误...

Default constructor cannot handle exception type IOException thrown by implicit super constructor. Must define an explicit constructor

我想做这样的事情,这样我就可以在我的 class 中的任何地方调用配置,现在我一直不得不实例化配置对象...必须有一种方法可以做到这一点。 ..任何帮助将不胜感激,提前致谢。

编辑:

配置class:

public class Configuration {

private String mainSchemaFile;


public Configuration() {
}

public Configuration( String configPath ) throws IOException {

    Properties prop = new Properties();
    prop.load( new FileInputStream( configPath ));

    this.mainSchemaFile= prop.getProperty("MAINSCHEMA_FILE");
}

您的 Configuration 构造函数被声明为抛出 IOException。任何使用此构造函数实例化 Configuration 的代码都必须捕获它。如果您使用变量初始值设定项,那么您将无法捕获它,因为您无法提供 catch 块;您不能在此处放置任何块,只能放置一个表达式。两者都没有声明 throws 子句的方法。

您的备选方案:

  • Toplevel 构造函数中实例化 Configuration。您可以 catch 构造函数主体中的异常,或者您可以声明该构造函数 throws 异常。

    public class Toplevel {
        Configuration config;
        public Toplevel() {
            try {
                config = new Configuration("testconfig.properties");
            } catch (IOException e) {  // handle here }
        }
        // ...
    
  • TopLevelclass中的实例初始化器中实例化Configuration,在那里你可以catch异常并处理它。

    public class Toplevel {
        Configuration config;
    
        {
            try {
                config = new Configuration("testconfig.properties");
            } catch (IOException e) {  // handle here }
        }
        // ...
    
  • Configuration 构造函数中捕获并处理异常,因此调用代码不必捕获异常。这不是首选,因为您可能实例化了一个无效的 Configuration 对象。调用代码仍然需要确定它是否有效。

    public class Configuration {
         // Your instance variables
         private boolean isValid;
    
         public Configuration( String configPath )  {
             try {
                 // Your code that might throw an IOE
                 isValid = true;
             } catch (IOException e) {
                 isValid = false;
             }
         }
    

当你创建一个新的 Toplevel 对象时,你还没有为它声明一个特定的构造函数,并且 Toplevel 的属性被实例化,就像你的代码用 Configuration config = new Configuration("testconfig.properties");

描述的那样

所以你没有处理Configuration构造函数的IoException! 更好的方法是像这样声明 Toplevel 的特定构造函数:

public Toplevel(){
    try{
        this.config = new Configuration("testconfig.properties");
    } catch (IOException e) {
        // handle Exception
    }
}