Java:溢出和打印两次

时间:2013-09-08 22:05:42

标签: java overflow

当我执行代码的这一部分时,我得到一个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。我使用时间而不是随机数生成器的原因是因为每次我运行程序时,生成器每次都会给我相同的序列。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

rndNum == x && rndNum == y

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

rndNum == X || rndNum == y

另外,正如@Sotirios Delimanolis指出的那样,你也有可变的掩蔽。他还解释了为什么发生StackOverflowError

答案 1 :(得分:1)

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

答案 2 :(得分:0)

第一个rndNum是本地的到时间。因此,实例级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。