为什么会产生java.lang.StackOverflowError,这是什么意思?

时间:2013-12-19 04:19:58

标签: java loops overflow

我为一个掷骰子游戏写了一个简单的代码。我还在弄清楚如何解决循环故障,但它在第33行给了我一个java.lang.StackOverflowError:
     //显示骰子的值         System.out.println(“你滚动”+死+“+”+ die2 +“。总计”+骰子);.

以下是代码:

 /**
 * A simulation of the craps betting game.
 * 
 * @
 * @
 */
import java.util.Random;



public class Craps
{
    //random number generator
    private Random randomNumber = new Random();

    //roll the dice
    public int rollDice()
    {
        //first die
        int die = (randomNumber.nextInt(6) + 1);

        //second die
        int die2 = (randomNumber.nextInt(6) + 1);

        //add die + die2
        int dice = die + die2;

        //point value
        int myPoint = 0;

        //display the value of dice
        System.out.println("You rolled " + die + "+ " + die2 + ". Totalling " + dice);

            if (dice == 7) {
                System.out.println ("Congratulations, YOU WIN!");
        }
        if (dice == 11) { 
            System.out.println ("Congratulations, YOU WIN!");
        }

            if (dice == 2) {
                System.out.println ("I'm sorry, you lose.");
    }
    if (dice == 3) {
        System.out.println ("I'm sorry, you lose.");
    }
    if (dice == 12) {
        System.out.println ("I'm sorry, you lose.");
    }

        else {
            System.out.println ("And the game continues...");
            myPoint = dice;
            if (dice == 7) {
                System.out.println ("I'm sorry, you lose.");
            }

        while (dice != 7)
        {
         rollDice();

            if (dice == myPoint) {
                System.out.println ("Congratulations, YOU WIN!");
            }
            else {
                myPoint = dice;
            }
        }
    }
    return dice;
}

}

3 个答案:

答案 0 :(得分:1)

因为当你以递归方式调用rollDice()时,你正在增长堆栈帧。你最终耗尽空间继续。你应该从你的方法返回一个int,并使用一个循环来调用它(也许是无限的)。

答案 1 :(得分:0)

您没有从rollDice函数正确返回,您继续以递归方式调用它。 您需要该方法的正确退出条件。

答案 2 :(得分:0)

试试这个......

 while (dice != 7)
    {
      dice  = rollDice();
      // ...
    }

代码中的问题是,因为dicerollDice()的局部变量,对rollDice()的递归调用不会更改当前函数中dice的值呼叫。因此,while循环永远不会退出。因此,对函数的递归调用会堆积并填充堆栈。

此错误消息仅表示您的堆栈内存已满。 Java将堆栈内存的大小限制为某个最大字节数。当递归函数调用堆积并填充它时,在某些时候,堆栈上没有足够的内存可用于下一个函数调用。此时java会抛出此错误。

我建议你阅读有关堆栈和堆内存的更多信息。
查看What and where are the stack and heap?