在下面給出的代碼中,看起來應該是HeapMemoryOverFlowError因為我們在對象內部創建對象,但它給出了StackOverflowError.public class JavaConcepts { JavaConcepts jc = new JavaConcepts(); public static void main(String[] args) { new JavaConcepts(); }}線程“主”中的異常java.lang.StackOverflowErrorat Java.JavaConcepts.<init>(JavaConcepts.java:5)at Java.JavaConcepts.<init>(JavaConcepts.java:5)at Java.JavaConcepts.<init>(JavaConcepts.java:5)at Java.JavaConcepts.<init>(JavaConcepts.java:5)
2 回答

智慧大石
TA貢獻1946條經驗 獲得超3個贊
問題在這里:
JavaConcepts jc = new JavaConcepts();
那jc
是一個實例變量,這意味著每個 JavaConcepts 類的實例都有一個。該變量在 JavaConcepts 實例被實例化時被初始化。
因此,請跟蹤執行時發生的情況new JavaConcepts()
。這會創建一個新的 JavaConcepts 實例,而后者又會初始化該jc
變量。為此,它創建了另一個 JavaConcepts 實例,而后者又需要初始化另一個jc
. 這種情況一直持續下去,每次new JavaConcepts()
初始化都發生在一個新的堆棧幀中。最終你用完了堆棧幀,你會得到一個 StackOverflowError。
視覺上:
new JavaConcepts(): jc = new JavaConcepts(); jc = new JavaConcepts(); jc = new JavaConcepts(); jc = new JavaConcepts(); ... (StackOverflowError)

小怪獸愛吃肉
TA貢獻1852條經驗 獲得超1個贊
說明:在這個程序中,main() 方法調用 JavaConcepts() 方法。JavaConcepts() 方法遞歸調用自身。此實現將導致 JavaConcepts() 方法被無限次調用。在這種情況下,JavaConcepts() 方法將無限次添加到線程的堆棧幀中。因此,在幾千次迭代之后,線程的堆棧大小限制將被超過。一旦超過堆棧大小限制,將導致 StackOverflowError
添加回答
舉報
0/150
提交
取消