[英]Java: Overflow and Printing Twice
当我执行我的代码的这部分时,我得到一个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
。 我使用时间而不是随机数生成器的原因是因为每次我运行程序时,生成器每次都会给我相同的序列。 任何帮助将不胜感激。
您正在使用错误的布尔运算符。
rndNum == x && rndNum == y
当且仅当rndNum等于x和y时才会传递 - 如果x和y是不同的值,这将永远不会发生。 您需要使用OR运算符' ||
“:
rndNum == X || rndNum == y
此外,正如@Sotirios Delimanolis指出的那样,你也有可变的掩蔽。 他还解释了StackOverflowError发生的原因
如果您只有一个变量rndNum
则一次只能分配一个值。 所以rndNum == 1&& rndNum == 6
以及if
s将是假的所有以下内容。 这就是为什么永远会调用timeTell()
原因。
第一个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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.