什么是StackOverflowError?

时间:2014-10-22 15:01:32

标签: java loops random numbers stack-overflow

我尝试生成一个没有重复数字的随机四位数字。我有一个方法来生成数字和两个来检查长度和重复。它按预期编译和工作,但偶尔会在运行时得到StackOverflowError。以下是代码块,它似乎遇到了问题:

//ensures that generated pattern is four digits long
public void randomCheck(){
    int patternNum = Integer.parseInt(pattern);
    if(patternNum<1000){
        numGen();
    }
    else{
        repeatCheck();
    }
}
//ensures that pattern is unique
public void repeatCheck(){
    solutionNumber();
    if((secondSolnDigit==firstSolnDigit)||(firstSolnDigit==thirdSolnDigit)||
    (firstSolnDigit==fourthSolnDigit)||(secondSolnDigit==thirdSolnDigit)||
    (secondSolnDigit==fourthSolnDigit)||(thirdSolnDigit==fourthSolnDigit)){
        numGen();
    }
    else{
    return pattern;
    }
}
//generates random number
public void numGen();{
    Random rand = new Random();
      int randomNum = rand.nextInt(10000);
      String patternString = Integer.toString(randomNum);
    pattern = patternString;
    randomCheck();
}

2 个答案:

答案 0 :(得分:0)

StackOverflowError是指必须将多个方法调用堆叠在一起的时候。 Java中有一个限制,即可以将多少方法调用相互堆叠。

您正在从numGen()方法调用randomCheck()并从randomCheck()方法调用numGen()这似乎是个问题。你的代码可能正在追逐它自己的尾巴。如果没有从randomCheck()调用numGen(),那么repeatCheck()也会调用numGen()。

如果在堆栈空间不足之前到达方法调用的末尾,它可能会工作正常。但在某些情况下,它会进行更多的方法调用,而不是其他方法调用堆栈并最终耗尽空间。这就是为什么它有时起作用而不起作用的原因。

您可以尝试使用循环来完成同样的事情。这样您就不必担心StackOverflowError。

答案 1 :(得分:0)

当彼此的方法调用太多时,会发生堆栈溢出错误。它通常发生在递归方法中。之所以如此,是因为您从numGen()randomCheck()拨打repeatCheck(),然后numGen()回拨randomCheck()

此处的解决方案是在while循环中进行测试,删除方法randomCheck()并将代码替换为:

//ensures that pattern is unique AND four digits long
public void repeatCheck(){
    solutionNumber();
    int patternNum = Integer.parseInt(pattern);
    while((secondSolnDigit==firstSolnDigit)||(firstSolnDigit==thirdSolnDigit)||
    (firstSolnDigit==fourthSolnDigit)||(secondSolnDigit==thirdSolnDigit)||
    (secondSolnDigit==fourthSolnDigit)||(thirdSolnDigit==fourthSolnDigit) || patternNum<1000){
        numGen();
    }

    return pattern;
}
//generates random number
public void numGen();{
    Random rand = new Random();
    int randomNum = rand.nextInt(10000);
    String patternString = Integer.toString(randomNum);
    pattern = patternString;
}

此外,为什么你将integer投放到string然后再投放到integer,你不能只使用生成的int吗?如果你真的需要它作为string,请转换它。

希望这会有所帮助。