我尝试生成一个没有重复数字的随机四位数字。我有一个方法来生成数字和两个来检查长度和重复。它按预期编译和工作,但偶尔会在运行时得到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();
}
答案 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
,请转换它。
希望这会有所帮助。