2015-11-01 86 views
7

我想使每個類的兩個類都有另一個類的實例化,但是需要一個java.lang.StackOverFlowError。第一類看起來像下面StackOverFlow類錯誤

public class ReverseGPA { 
GPpredictor gp_predictor = new GPpredictor(); //This is the line that causes error 

double CURRENT_CREDITS; 
double FUTURE_CREDITS; 
double CUM_GPA; 
double DESIRED_GPA; 

double NEW_GRADE_POINT; 
int ROUNDED_GRADE_POINT; 

double NEW_GPS; 
} 

而其他類看起來像這樣

public class GPpredictor { 
ReverseGPA rev_gpa = new ReverseGPA(); //This is the line that causes error 

ArrayList<String> arrayCourseName = new ArrayList<>(); 
ArrayList<Integer> arrayCourseCredit = new ArrayList<>(); 
ArrayList<String> arrayCourseGrade = new ArrayList<>(); 

int COURSES; 
int CREDIT; 
String COURSENAME; 

//For predicting purposes 
int GRADE; 
} 

我把它喜歡這樣,因爲我需要使用從類ReverseGPA方法在課堂GPpredictor使用(我需要使用等級分,通過使用getter方法)

將是任何意見非常感謝,並幫助

回答

7

你有無限遞歸GOI因爲這些類在它們自己內部創建彼此的實例,所以ReverseGPA創建GPpredictor實例,該實例創建一個ReverseGPA,該實例創建一個GPpredictor,該GPpredictor創建一個ReverseGPA,該GPGPredictor創建一個GPpredictor,該GPGPredictor創建一個創建GPpredictor的ReverseGPA ....

所以具體的方式,您有:

public class A { 
    B b = new B(); 
} 

public class B { 
    A a = new A(); 
} 

停止瘋狂 - 通過構造函數的參數或setter方法傳遞一個實例,這些類中的至少一個。我不確定你的課程是做什麼的,所以我不能說哪個(或者兩者)應該這樣做。

再次,在一個具體的方式,至少有一個做

public class A { 
    B b; 

    public void setB(B b) { 
     this.b = b; 
    } 
} 

public class B { 
    A a; 

    public B(A a) { 
     this.a = a; 
    } 
} 

,並在主方法

public static void main(String[] args) { 
    A a = new A(); 
    B b = new B(a); // pass a into B 
    a.setB(b); // pass b into A 
} 
+0

你好,非常感謝你的快速回復!但是,我有這個問題。 ReverseGPA類有一個調用GPpredictor方法的方法。 GPpredictor的方法需要ReverseGPA值。那麼解決方案是創建每個類的實例否?我錯過了什麼嗎?非常感謝您的回答,抱歉,您的時間不夠 – Adam

+0

@ user3764392:是的,我已經告訴過您應該做什麼。您無法在每個類中創建兩個實例,因此請至少將一個實例傳遞給另一個實例。 –

+0

非常感謝,解決了這個問題! – Adam