2015-04-26 21 views
0

我試圖通過基於模數初始化我的怪物對象來將三種怪物添加到數組中。 (我只是一個初學者,所以忍受着我)。由於某些原因,我的對象無法初始化,因爲「else if」循環

for (int i=0; i<nrofMonsters; i++) { 
    Monster m; 
    if (i%2==0) { 
     m = new Vampire("Vamp-"+i); 
    } else if(i%2==1) { 
     m = new Ghost("Ghost-"+i); 
    } else if(i%3==2){ 
     m = new Demon("Demon-"+i); 
    } 
    monsters.add(m); 
} 

錯誤信息:變量m可能沒有被初始化。

回答

0

錯誤消息非常明確:整個代碼中都有可能的執行路徑,它們在monsters.add(m);語句中訪問之前不會導致將特定值分配到m

具體來說,有沒有最終elseif-else if鏈分配的其他值:

if (i%2==0) { 
    m = new Vampire("Vamp-"+i); 
} else if(i%2==1) { 
    m = new Ghost("Ghost-"+i); 
} else if(i%3==2){ 
    m = new Demon("Demon-"+i); 
} 
else { 
    m = …whatever…; // or, handle this as an error 
} 
monsters.add(m); 

注意,編譯器(顯然)是沒有足夠的智慧理解if S中的條件,因此不能告訴else部分是沒有必要的。


認爲你,其實,想是這樣的:

if(i%3==2){ 
    m = new Demon("Demon-"+i); 
} else if (i%2==0) { 
    m = new Vampire("Vamp-"+i); 
} else { 
    m = new Ghost("Ghost-"+i); 
} 
+1

明白了!謝謝! –

+0

@ Re-Animator好。針對您的下一個問題:通過用相應的標籤標記您的問題來指定您的編程語言非常有用。 –

+0

絕對會,會做! –

0

if else階梯從上到下。當你基於模2刪除時,你只能有2個結果0或1.因此你永遠不會達到i%3。你可以刪除基於3的一切,你會得到3個結果。

如下所述,我不認爲這是一個初始化問題 - 你可以分享你正在寫的語言(並且檢查繼承樹 - 當你是初學者時可能會出現一些令人討厭的錯誤)

+0

這是真的,但沒有解決問題。 –

+0

是的,但由於模塊2的邏輯,所以也沒有辦法去其他的默認設置。所以問題可能是遺傳性問題。例如,如果怪物列表不是根類 – Dante

+0

這似乎有點偏離我。沒有任何遺產問題。 OP正在得到一個明確的編譯器錯誤,並希望首先了解它*。第二,OP的程序邏輯有缺陷。 –

0

變量 'm' 是一個局部變量。 必須對局部變量進行初始化。 否則它必須導致編譯錯誤。

像下面一個簡單的分配將解決這個問題:

怪物M = NULL;

雖然上述分配會導致NullPointerException,因爲代碼可能不會達到任何'if'或'else if'結構。

因此,最好添加'else'結構以確保代碼成功運行。

相關問題