Программа 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.