我为一个掷骰子游戏写了一个简单的代码。我还在弄清楚如何解决循环故障,但它在第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;
}
}
答案 0 :(得分:1)
因为当你以递归方式调用rollDice()
时,你正在增长堆栈帧。你最终耗尽空间继续。你应该从你的方法返回一个int,并使用一个循环来调用它(也许是无限的)。
答案 1 :(得分:0)
您没有从rollDice函数正确返回,您继续以递归方式调用它。 您需要该方法的正确退出条件。
答案 2 :(得分:0)
试试这个......
while (dice != 7)
{
dice = rollDice();
// ...
}
代码中的问题是,因为dice
是rollDice()
的局部变量,对rollDice()
的递归调用不会更改当前函数中dice
的值呼叫。因此,while循环永远不会退出。因此,对函数的递归调用会堆积并填充堆栈。
此错误消息仅表示您的堆栈内存已满。 Java将堆栈内存的大小限制为某个最大字节数。当递归函数调用堆积并填充它时,在某些时候,堆栈上没有足够的内存可用于下一个函数调用。此时java会抛出此错误。
我建议你阅读有关堆栈和堆内存的更多信息。
查看What and where are the stack and heap?