2015-05-26 3 views
0

Я получил это исключение.Исключение StackOverflowError в конструкторе

Exception in thread "main" java.lang.StackOverflowError 
at java.util.AbstractCollection.<init>(AbstractCollection.java:66) 
at java.util.AbstractList.<init>(AbstractList.java:76) 
at java.util.ArrayList.<init>(ArrayList.java:151) 

Означает ли это, что класс не может содержать объекты как переменную? Но в реализации связанного списка узел может содержать узел, указывающий на себя?

public class Test { 

String name; 
List<Test> related; 

public Test() { 

    name = "dog"; 
    related = new ArrayList<Test>();  
    related.add(new Test()); 
    related.add(new Test()); 
    related.add(new Test()); 
} 

public List<Test> relate() { 

    return related; 
} 

public String toString() { 
    return name; 
} 

public static void main(String[] args) { 

    Test test = new Test(); 
    for(Test t : test.relate()) { 
     System.out.println(t); 
    } 
} 
} 
+0

Что 'нового Test()' делать внутри? –

+0

Это не проблема с тем, что у calss есть свой объект как переменная-член в нем, я думаю, что это из-за рекурсивного вызова метода, вы должны следовать логике, которая выйдет из рекурсивного вызова – Babel

ответ

1

Вы можете решить эту проблему путем добавления параметра в конструктор, который определяет, сколько элементов, чтобы добавить, что свидетельствует о том, что проблема не ограничена рекурсия в коде, а не врожденная проблема в создании нового экземпляра в конструкторе:

import java.util.ArrayList; 
import java.util.List; 

public class Test { 

    String name; 
    List<Test> related; 

    public Test(int numberToAdd) { 

    name = "dog"; 
    related = new ArrayList<Test>(); 
    for (int i = 0; i < numberToAdd; i++) { 
     related.add(new Test(0)); 
    } 
    } 

    public List<Test> relate() { 

    return related; 
    } 

    public String toString() { 
    return name; 
    } 

    public static void main(String[] args) { 

    Test test = new Test(3); 
    for (Test t : test.relate()) { 
     System.out.println(t); 
    } 
    } 
} 
2

Ваш конструктор создает три новых экземпляров само по себе, каждый из которых создает три новых экземпляров, каждый из которых создает три новых экземпляров и так далее.

Чтобы исправить это, вы должны создать два отдельных класса - один, который реализует связанный список, а другой - для создания и использования связанного списка.

1
public Test() { 

    name = "dog"; 
    related = new ArrayList<Test>();  
    related.add(new Test()); // Here, you can calling the constructor 
    related.add(new Test()); // recursively within the constructor? 
    related.add(new Test()); // Hence the StackOverflowError? 
} 

Не думайте, что это имеет какое-либо отношение к классу, содержащему объекты как переменную.

0

Как об этом один:

package com.my.test; 

import java.util.ArrayList; 
import java.util.List; 

public class Test { 

private String name; 
private List<Test> related; 

public Test(String name, int times) { 
    this.name = name; 
    related = new ArrayList<Test>(); 
    for(int i = 0; i < times; i++) { 
     related.add(new Test("child"+i, 0)); 
    } 
} 

public List<Test> relate() { 
    return related; 
} 

public String toString() { 
    return name; 
} 

public static void main(String[] args) { 
    Test test = new Test("parent", 3); 
    for (Test t : test.relate()) { 
     System.out.println(t); 
    } 
} 
} 
Смежные вопросы