Java:溢出和打印两次

Java:溢出和打印两次,java,overflow,Java,Overflow,当我执行这部分代码时,我得到一个StackOverflower错误: /** * Determine the story based on the time. */ private void timeTell() { if(replay == 0){ long rndNum = System.currentTimeMillis() % 10; chooseStory(); } } /** * Randomly choose which story to t

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

/**
 * 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()
方法中。这只是更容易测试。我试图找出问题发生的地方,所以我替换了
choosetory()带有
系统输出打印项次(rndNum)并将数字打印两次。变量
replay
用于查看程序是否已经运行过一次。如果用户决定再次播放,
replay
将从默认值0更改为1,并跳过生成新的
rndNum
。我之所以使用时间而不是随机数生成器,是因为每次我运行程序时,生成器每次都会给我相同的序列。非常感谢您的帮助。

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

rndNum == x && rndNum == y
当且仅当rndNum同时等于x和y时才会通过-如果x和y是不同的值,则不会发生这种情况。您需要使用OR运算符“
|
”:

rndNum == X || rndNum == y

此外,正如@Sotirios Delimanolis指出的,变量掩蔽也在进行。他还解释了StackOverflower错误发生的原因

如果您只有一个变量
rndNum
,则一次只能为其分配一个值。因此
rndNum==1&&rndNum==6
和以下所有
if
s将为false。
这就是为什么总是调用
timeTell()

第一个rndNum是timeTell本地的。因此,实例级rndNum可能未初始化

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

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块,因此对TIMETEL的递归调用无穷无尽,从而导致堆栈溢出。

请注意,
timetell()
方法隐藏了
rndNum
变量。不,您是正确的,如果OP先解决这个问题,隐藏只会有副作用。谢谢。我是Java新手。我记得在以前的程序中使用了和,我的老师从来没有教过我关于或。现在可以了:)