Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是StackOverflowerr?_Java_Loops_Random_Numbers_Stack Overflow - Fatal编程技术网

Java 什么是StackOverflowerr?

Java 什么是StackOverflowerr?,java,loops,random,numbers,stack-overflow,Java,Loops,Random,Numbers,Stack Overflow,我试图生成一个没有重复数字的随机四位数。我有一个生成数字的方法和两个检查长度和重复的方法。它按照预期进行编译和工作,但是,在运行时,偶尔会出现StackOverflower错误。下面是代码块,它似乎有问题: //ensures that generated pattern is four digits long public void randomCheck(){ int patternNum = Integer.parseInt(pattern); if(patternNum&

我试图生成一个没有重复数字的随机四位数。我有一个生成数字的方法和两个检查长度和重复的方法。它按照预期进行编译和工作,但是,在运行时,偶尔会出现StackOverflower错误。下面是代码块,它似乎有问题:

//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();
}

StackOverflowerError是指必须将多个方法调用堆叠在一起。在Java中,可以相互堆叠的方法调用数量是有限制的

您正在从numGen方法调用randomCheck,并从randomCheck方法调用numGen这似乎就是问题所在。你的代码可能在追逐自己的尾巴。如果未从randomCheck调用numGen,则repeatCheck也会调用numGen

如果在堆栈耗尽空间之前到达方法调用的末尾,它有时可能工作得很好。但在某些情况下,它会比其他方法调用更多向堆栈中添加更多调用,并最终耗尽空间。这就是为什么它有时起作用,而另一些则不起作用


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

当彼此中有太多方法调用时,就会发生堆栈溢出错误。它通常发生在递归方法中。在这里发生这种情况是因为您从randomCheck和repeatCheck调用numGen,然后numGen回调randomCheck

这里的解决方案是在while循环中进行测试,删除您的随机检查方法,并将代码替换为:

//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;
}
此外,为什么要将整数转换为字符串,然后再转换回整数,难道不能在生成整数时使用整数吗?如果您真的需要它作为字符串,请在之后转换它


希望这能有所帮助。

您的方法彼此调用,但无法完成执行,因此堆会不断增长,直到内存耗尽!我问自己,搜索和阅读它的描述有多困难:当一个应用程序递归太深而导致堆栈溢出时抛出。我如何修改我的算法以避免这种情况发生?出于好奇,为什么不将数字放入一个列表中,将其洗乱,然后弹出4?这样,你就保证了唯一性和四个数字。请的可能重复,键入时按Enter键一两次:这称为段落。谢谢你提供的信息:我只是说,用这种方式阅读并不特别容易。无意冒犯。@X.L.Ant哈哈,我同意我会给你留一些空间。我已经试过了,但是由于某些原因,我仍然会因为我不存在的随机检查而得到运行时错误。是否有缓存或我应该删除的内容?我每次运行它都会重新编译它你是什么意思?对于不存在的随机检查,您没有编译错误?好的,所以我只是删除了类文件并重新编译。但是现在整个程序什么都不做。我将编译并运行,但一旦我这样做,我键入的任何内容都会显示出来,但什么也不会发生。如果您将repeatCheck重命名为randomCheck,会发生什么?啊。我忘记删除对randomCheck的方法调用。谢谢让它工作起来。