Почему я получаю переполнение стека? - PullRequest
0 голосов
/ 24 февраля 2019

Мой первый блок кода - мой объектный файл.второй - это основной класс.До этого не было никаких проблем с выполнением кода, но после того, как я добавил файл для чтения и записи, мой код начал получать ошибку потока стека.только фрагмент, из которого вызывается ошибка.

    public class Item implements java.io.Serializable {

    public static String name;
    public static double price;
    public static double amount;
    public int max = 1;
    SlayerProgram sp = new SlayerProgram();
    ReadFile rf = new ReadFile();
    public Item(String name, double price,double amount )
    {
    this.name = name;
    this.price = price;
    this.amount = amount;

    }

    public void ItemSet(String name, double price,double amount)
    {
    this.name = name;
    this.price = price;
    this.amount = amount  
    }

Мой основной класс:

    public class SlayerProgram {
//import file txts, and Item Class

        static String name;
        static double price;
        static double amount;
 Item item = new Item(name,price,amount);
ReadFile rf = new ReadFile();
static String fileNameText = "D:\\Game\\SlayerProgram\\Name.txt";
static String filePriceInt = "D:\\Game\\SlayerProgram\\Price.txt";
static String fileAmountInt ="D:\\Game\\SlayerProgram\\Amount.txt";

   //begin file Read   

public void BeginText() throws IOException
{
    TextFile();
}

public void Max()
{
    item.Max();
}

    //declare needed Data Types;
        final int max = item.max;
        ArrayList<String> Name  = new ArrayList<>();
        ArrayList<Double> Price = new ArrayList<>();
        double size = Price.size();
        ArrayList<Double> Amount = new ArrayList<>();


Exception in thread "main" java.lang.StackOverflowError
at slayerprogram.Item.<init>(Item.java:18)
at slayerprogram.SlayerProgram.<init>(SlayerProgram.java:25)
at slayerprogram.Item.<init>(Item.java:18)
at slayerprogram.SlayerProgram.<init>(SlayerProgram.java:25)

Как найти причину переполнения стека?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Поскольку существует зависимость circular между Item и SlayerProgram классом.Вы создали Item item = new Item(name,price,amount); в классе SlayerProgram и SlayerProgram sp = new SlayerProgram(); в классе Item.Поэтому, когда вы пытаетесь создать объект Item, он попытается создать объект SlayerProgram, а затем SlayerProgram попытается создать объект Item, и он все еще будет method stack is not full и приведет к StackOverflow.

0 голосов
/ 24 февраля 2019

Item создает SlayerProgram:

SlayerProgram sp = new SlayerProgram();

И SlayerProgram создает Item

Item item = new Item(name,price,amount);

И поэтому при инициализации вы будете создавать эти объекты бесконечно

Есть аналогичный пример Baeldung для получения StackOverflowError

Это заканчивается StackOverflowError, поскольку конструктор ClassOne создает экземпляр ClassTwo, а конструктор ClassTwo снова создает экземпляр ClassOne,

...