Программа stucks при создании объекта класса в java
У меня есть родительский класс "Окно приложения" и дочерний класс "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);
}
}
}
Ответы
Ответ 1
Config
объект создается циклически. когда вы создаете объект Config
, тогда неявный конструктор аргументов класса ApplicationWindow
выполняется, и еще раз он создает объект объекта Config
Object, и он повторяется. ![enter image description here]()
Помните одну вещь,
неявный конструктор без аргументов суперкласса всегда будет вызываться, даже если вы его не назовете.
public Config()
{
super(); // compiler adds this statement inside constructor even if you don't declare
}
и ваш суперкласс ApplicationWindow
создает еще один объект Config
.
Чтобы этого избежать, удалите строку создания объекта new Config()
из конструктора класса ApplicationWindow
, которая остановит цикл. и у вас уже есть ссылка созданного объекта Config
.
Ответ 2
В этом проблема:
public class config extends ApplicationWindow
в сочетании с этим в конструкторе ApplicationWindow
:
cfg = new config();
Итак, чтобы создать новый ApplicationWindow
, вам нужно создать новый config
... но сам ApplicationWindow
, поэтому он создаст еще один config
... который, в свою очередь, создаст еще один config
и т.д.
Почему config
расширяет ApplicationWindow
? Это звучит как странный дизайн для меня - конфигурация - это не окно. Просто избавитесь от этой спецификации extends
, и вы можете обнаружить, что все остальное работает.
Кроме того, я настоятельно рекомендую вам следовать соглашениям об именах Java (например, использовать PascalCase для имен классов) и сделать все ваши поля частными.
Ответ 3
Вы создали объект класса Child в классе Constructor of Parent. Когда вы создаете Object of Child Class, он вызывает конструктор, который сначала вызывает Parent Class Constructor, а затем выполняет дочерний класс Constructor, где снова создается объект дочернего класса, и он повторяется снова и снова. Поэтому он вызывает здесь рекурсивную операцию, следовательно, бесконечный цикл.
Ответ 4
config не должен расширять ApplicationWindow, так как у вас есть следующая ситуация:
AppWindow вызывает конструктор из config, а конструктор config вызывает его супер-конструктор, который является AppWindow → endless
Ответ 5
Почему вы делаете config
от ApplicationWindow
? Вы должны удалить это отношение наследования.
Ваш код вызовет ошибку, поскольку конструктор подкласса сначала вызовет его родительский конструктор при инициализации. Проблема состоит в том, что ваш ApplicationWindow
, как родительский класс config
, вызывает конструктор своего подкласса, как неожиданно, и вызовет бесконечный цикл.
Ответ 6
Если вы намереваетесь вызвать readProperties() из ApplicationWindow, тогда сделайте его абстрактным методом и удалите ссылку cfg.