簡體   English   中英

Java:溢出和打印兩次

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM