我想实例化一个对象与它的构造函数之外的方法。例子:
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
我想做这样的事情,所以我可以调用配置在我的类的任何地方,现在我一直必须实例化配置对象…一定有办法的……任何帮助都将不胜感激,提前感谢。
编辑:配置类:
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 } } // ...
-
在
TopLevel
类的实例初始化器中实例化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");
描述的那样
所以你不处理配置构造函数的IoException !一个更好的方法是像这样声明一个特定的顶层构造函数:
public Toplevel(){
try{
this.config = new Configuration("testconfig.properties");
} catch (IOException e) {
// handle Exception
}
}