2014-01-23 98 views
0

我有一個父類「Application Window」和一個子類「config」。當我創建一個「config」類的對象時,執行往往會進入一個循環並持續創建這個對象。程序在java中創建類對象時出現的問題

以下是代碼snipppet:

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(); 
    } 
} 

兒童級 「配置」 下面:

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

您似乎已經收到了很好的答案,但請記住您可以在代碼中添加斷點並在Eclipse中調試您的應用程序。這會讓你有機會確切地知道代碼的流動方式,看看出了什麼問題。 – Fredrik

+0

感謝您的建議。但我一直記得這一點。 :) – deejaydrives

回答

0

Config對象正在以循環方式創建。當您創建Config對象時,則隱式無參數構造函數ApplicationWindow類會執行,並且會再次創建一個對象config對象並重復該操作。 enter image description here

記住一件事,
即使不調用超類的隱式無參構造函數,也總是會被調用。

public Config() 
{ 
    super(); // compiler adds this statement inside constructor even if you don't declare 
} 

,你的超ApplicationWindow正在創造另一個Config對象。

爲了避免這種情況,請從ApplicationWindow類構造函數中刪除new Config()對象創建線,該構造函數將停止循環。並且您已經創建了Config對象的引用。

0

這就是問題所在:

public class config extends ApplicationWindow 

連同這在ApplicationWindow構造函數:

cfg = new config(); 

所以要創建一個新的ApplicationWindow,你需要創建一個新的config ...但是,這是一個ApplicationWindow本身,所以它會創建另一config ...這將反過來創造另一config等。

config爲什麼要延伸ApplicationWindow?這聽起來像是一個奇怪的設計 - 配置不是一個窗口。只要擺脫extends規格,你可能會發現其他所有的工作。

此外,我會強烈建議您遵循Java命名約定(例如,使用PascalCase的類名稱),並使您的所有字段私有。

0

您已經在父類的構造函數中創建了Child類對象。當你創建子類的對象時,它的構造函數被調用,它基本上首先調用父類構造函數,然後執行子類構造函數,在那裏再次創建子類對象,並且一次又一次地重複。所以它在這裏引起遞歸操作,因此造成無限循環。

0

配置不能擴展ApplicationWindow,因爲你有以下情況: APPWINDOW調用從配置構造,並配置構造函數調用其超強的構造是APPWINDOW - >無盡

0

你爲什麼讓configApplicationWindow延伸?你應該刪除這種繼承關係。

您的代碼將導致堆棧溢出錯誤,因爲子類的構造函數將在初始化時首先調用其父構造函數。問題是你的ApplicationWindow,作爲父類config,調用它的子類的構造函數,這是意想不到的,並會導致無限循環。

0

如果您打算從ApplicationWindow調用readProperties(),然後將其設置爲抽象方法並刪除cfg引用。