0

当我执行这部分代码时,我得到一个 StackOverflowError:

/**
 * Determine the story based on the time.
 */
private void timeTell()
{
    if(replay == 0){
    long rndNum = System.currentTimeMillis() % 10;
    chooseStory();
    }
}

/**
 * Randomly choose which story to tell based on the current system time.
 */
private void chooseStory()
{
    if(rndNum == 1&& rndNum == 6){
        storyOne();
    }
    else if(rndNum == 2&& rndNum == 7){
        storyTwo();
    }
    else if(rndNum == 3&& rndNum == 8){
        storyThree();
    }
    else if(rndNum == 4&& rndNum == 9){
        storyFour();
    }
    else if(rndNum == 5&& rndNum == 0){
        storyFive();
    }
    else{
        timeTell();
    }
}

我明白我不需要这个方法,我解决这个问题后将timeTell()它添加到方法中。chooseStory()这更容易进行测试。我试图找出问题出在哪里,所以我替换chooseStory();System.out.println(rndNum);它并打印了两次。该变量replay用于查看程序是否已经运行过一次。如果用户决定再次播放,replay则从默认值 0 更改为 1 并跳过生成新的rndNum. 我使用时间而不是随机数生成器的原因是因为每次我运行我的程序时,生成器每次都会给我相同的序列。任何帮助将不胜感激。

4

3 回答 3

1

您使用了错误的布尔运算符。

rndNum == x && rndNum == y

当且仅当 rndNum 等于 x 和 y 时才会通过 - 如果 x 和 y 是不同的值,这将永远不会发生。您需要使用 OR 运算符 ' ||':

rndNum == X || rndNum == y

此外,正如@Sotirios Delimanolis 指出的那样,您还可以进行变量掩蔽。他还解释了发生 StackOverflowError 的原因

于 2013-09-08T22:10:19.373 回答
1

如果您只有一个变量rndNum,则一次只能为其分配一个值。因此rndNum == 1&& rndNum == 6,以下所有ifs 都将是错误的。这就是为什么timeTell()总是会被调用的原因。

于 2013-09-08T22:10:28.797 回答
0

第一个 rndNum 是本地到 timetell。所以可能实例级别的 rndNum 没有初始化。

但即使它已正确初始化,您的条件检查也必须是 OR 不是 AND。一个变量一次只能有一个值。

private void chooseStory()
{
if(rndNum == 1|| rndNum == 6){
    storyOne();
}
else if(rndNum == 2|| rndNum == 7){
    storyTwo();
}
else if(rndNum == 3|| rndNum == 8){
    storyThree();
}
else if(rndNum == 4|| rndNum == 9){
    storyFour();
}
else if(rndNum == 5|| rndNum == 0){
    storyFive();
}
else{
    timeTell();
}

因此,目前您的所有条件都出错了,并且每次都控制到达 else 块,因此对 timetell 和 stackOverFlow 进行了无休止的递归调用。

于 2013-09-08T22:10:31.123 回答