我有一个父类“应用程序窗口”和一个子类“config”。当我创建“config”对象时,类执行往往会进入循环并继续创建此对象。
以下是代码截图:
public class ApplicationWindow implements ActionListener{
public String workSpace;
public String logFile;
public JFrame frmGenericAutomationFramework;
public JProgressBar progressBar;
public File currentTestSuiteFolder;
public String currentTestSuiteName;
config cfg;
SettingsFrame settingsFrame;
TestSuiteFrame testSuiteFrame;
PromptTestSuiteName testSuitePrompt;
public ApplicationWindow (){
initialize();
//**cfg = new config();**
cfg.readProperties();
}
}
下面的子类“config”:
public class config extends ApplicationWindow{
String str;
File cfgfile;
FileOutputStream out;
FileInputStream in;
Properties props;
String filepath = "D:/Webdriverwork/GAF/res/elements.properties";
public config (){
try{
cfgfile = new File(filepath);
in = new FileInputStream(cfgfile);
props = new Properties();
}
catch (Exception e){
// Log message in log file
String message = e.getMessage();
System.out.println(message);
// Exit the system
System.exit(0);
}
}
public void readProperties (){
try{
props.load(in);
workSpace = props.getProperty("WORKSPACE");
logFile = props.getProperty("LOGFILE");
}
catch (Exception e){
// Log message in log file
String message = e.getMessage();
System.out.println(message);
// Exit the system
System.exit(0);
}
}
public void updateProperty (String key, String value){
try{
props.setProperty(key,value);
}
catch (Exception e){
// Log message in log file
String message = e.getMessage();
System.out.println(message);
// Exit the system
System.exit(0);
}
}
public void writeProperties (){
try{
in.close();
out = new FileOutputStream(cfgfile);
props.store(out, null);
out.close();
}
catch (Exception e){
// Log message in log file
String message = e.getMessage();
System.out.println(message);
// Exit the system
System.exit(0);
}
}
}
答案 0 :(得分:0)
这是问题所在:
public class config extends ApplicationWindow
与ApplicationWindow
构造函数中的
结合使用:
cfg = new config();
因此,要创建新的ApplicationWindow
,您需要创建一个新的config
...但这本身就是ApplicationWindow
,因此它会创建另一个 config
...反过来会创建另一个 config
等。
为什么config
会延长ApplicationWindow
?这听起来像是一个奇怪的设计 - 配置不是一个窗口。只需摆脱extends
规范,你就会发现其他一切都有效。
此外,我强烈建议您遵循Java命名约定(例如,使用PascalCase作为类名)并将所有字段设为私有。
答案 1 :(得分:0)
Config
对象以循环方式创建。当你创建Config
对象时,隐式没有ApplicationWindow
类的参数构造函数执行,并且再次创建config
对象的对象并重复它。
记住一件事,
即使你没有调用它,也总会调用超类的隐式无参数构造函数。
public Config()
{
super(); // compiler adds this statement inside constructor even if you don't declare
}
并且您的超类ApplicationWindow
正在创建另一个Config
对象。
要避免这种情况,请从new Config()
类构造函数中删除ApplicationWindow
对象创建行,这将停止循环。并且您已经创建了Config
对象的引用。
答案 2 :(得分:0)
您已在Parent类的构造函数中创建了Child类对象。当您创建Object of Child Class时,它的构造函数被调用,它首先调用Parent Class Constructor然后执行Child Class Constructor,再次创建子类对象并且它会一次又一次地重复。所以它在这里导致递归操作,因此无限循环。
答案 3 :(得分:0)
config不能扩展ApplicationWindow,因为您有以下情况: AppWindow从config调用构造函数,config构造函数调用其超级构造函数,即AppWindow - >无端
答案 4 :(得分:0)
为什么config
从ApplicationWindow
延伸?您应该删除此继承关系。
您的代码将导致堆栈溢出错误,因为子类的构造函数将在初始化时首先调用其父构造函数。问题是你的ApplicationWindow
,作为config
的父类,调用其子类的构造函数,这是意外的,并将导致无限循环。
答案 5 :(得分:0)
如果您打算从ApplicationWindow调用readProperties(),那么将其设为抽象方法并删除cfg引用。