Java:溢出和打印两次
当我执行这部分代码时,我得到一个StackOverflower错误: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
/**
* 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新手。我记得在以前的程序中使用了和,我的老师从来没有教过我关于或。现在可以了:)