stackoverflowerror null

时间:2012-03-11 07:46:30

标签: java

我在这里遇到的错误是在我的方法调用和类创建其他类的构造函数中的无限或接近无限循环。我的程序尝试做的是根据实际统计数据半随机生成调查结果。我不仅非常欣赏这里出现的错误。但是有关如何防止这种情况发生的一些建议和指示以及我自己分析错误消息的方法。我得到了一些工作,但就像我在下面说的那样,我是大学新生编程的新手,所以编程对我来说是新的。提前致谢并对我以前的帖子感到抱歉,我想我会花些时间给你们一个合适的帖子。

我是编程的新手,这是我自己完成的第二个项目,所以我很抱歉,如果它不是最好的。

这是我的测试类:

 public Tester()
{
    randomGenerator = new Random();
    probability = new Probability();
    stats = new Statistics();
    double chance = randomGenerator.nextDouble();
    double gender = probability.getProbabilityOfMale();
    if(chance > gender)
    {
        male = false;
        stats.incrementFemale();
    }else{
        male = true;
        stats.incrementMale();
    }
    age = randomGenerator.nextInt(49)+16;
    int range = stats.getNumberOfQuestion();
    for(int i=0;i<range;i++)
    {
       probabilities = probability.probOfAnswer(i);
       answers = probability.getAnswers(i);
       chance = randomGenerator.nextDouble();
       int size = probabilities.size();
       for(int j=0;j<size;j++)
       {
         double qTemp = chance - probabilities.get(j);
         if(qTemp <= 0.0)
         {
             Answer aTemp = answers.get(j);
             aTemp.incrementCounter();
             answers.set(j,aTemp);
          }
       }
    }
}

统计课程:

 public ArrayList<Answer> getAnswers(int index)
{
    temp = survey.getAnswers(index);
    return temp;
}

public int getMale()
{
    return male;
}

public int getFemale()
{
    return female;
}

public int getNumberOfQuestion()
{
    return numberOfQuestion;
}

public void incrementNumberOfQuestion()
{
    numberOfQuestion++;
}

public void incrementMale()
{
    male++;
}

public void incrementFemale()
{
    female++;
}

和概率等级:

 public Probability()
{
    stats = new Statistics();
    probOfAnswer = new ArrayList<Double>(0);
}

public ArrayList<Double> probOfAnswer(int index)
{               
    temp = stats.getAnswers(index);
    int size = temp.size();
    for(int i=0;i<size;i++)
    {
        aTemp = temp.get(i);
        for(int j=0;j<size;j++)
        {
            Answer aTemp = temp.get(j);
            sum += (double)aTemp.getCounter(); 
        }
        double number = (double)aTemp.getCounter();
        probOfAnswer.add(number/sum);
        sum = 0;

    }
    return probOfAnswer;
}

public ArrayList<Answer> getAnswers(int index)
{
    temp = stats.getAnswers(index);
    return temp;
}

public ArrayList<Double> getProbofAnswer()
{
    return probOfAnswer;
}

public void probabilityOfMale()
{        
    double male = (double)stats.getMale();
    double female = (double)stats.getFemale();
    probabilityOfMale = male / (male + female);
}

public double getProbabilityOfMale()
{
    return probabilityOfMale;
}

这些是循环存在的唯一真正重要的部分,其他代码不需要上传。

我无法在此网站上传我的错误消息,因为它不接受它作为代码插入中的代码,然后它不会让我之后提交消息,所以我要上传代码elseware并链接它。

http://forum.overdosed.net/index.php/topic/56608-this-is-unimportant/

但我不知道论坛会让我在那里保留那篇文章多长时间&gt;&lt;

3 个答案:

答案 0 :(得分:3)

at Question.<init>(Question.java:17)
at Survey.addQuestion(Survey.java:23)
at Statistics.<init>(Statistics.java:52)
at Question.<init>(Question.java:17)
at Survey.addQuestion(Survey.java:23)
at Statistics.<init>(Statistics.java:52)
at Probability.<init>(Probability.java:19)

您需要检查问题为什么创建统计信息对象,然后统计信息再次尝试创建导致无限递归的Question对象。给出行号,您可以查看相应的行。

答案 1 :(得分:2)

根据堆栈跟踪判断,问题在于您尚未向我们展示的三个部分 - QuestionStatistics构造函数以及Survey.addQuestion方法:

从堆栈跟踪:

at Survey.addQuestion(Survey.java:23)
at Statistics.<init>(Statistics.java:52)
at Question.<init>(Question.java:17)
at Survey.addQuestion(Survey.java:23)
at Statistics.<init>(Statistics.java:52)
at Question.<init>(Question.java:17)

因此,您的Question构造函数正在调用Statistics构造函数。但是Statistics构造函数然后调用Survey.addQuestion,而Question又调用Statistics构造函数。

对我来说,感觉像很多更多正在进行的建设比真正有用。为什么Statistics构造函数需要在调查中添加任何内容?我不希望Probability课程甚至知道关于调查和问题。

通过将对现有对象的引用传递给构造函数,可以解决很多问题,因此Statistics构造函数可能更好 >在其构造函数中使用 stats引用,并将其用于Statistics字段,而不是创建新的{{1}}对象本身。在不知道这些类真正意味着什么的情况下很难说...这可能是问题的一部分。您是否牢牢掌握每个班级的责任?在进行任何代码更改之前,请仔细考虑。

答案 2 :(得分:0)

我们没有相关的源代码,但错误消息显示错误:

  1. Tester创建概率
  2. 概率构造函数创建统计
  3. 统计构造函数调用Survey.addQuestion()
  4. addQuestion()创建问题
  5. 问题创建统计信息(转到3并无限循环)
  6. 我认为你应该传递对象而不是每次都创建它们。