2013-10-09 125 views
0

這裏編程noob。我試圖編寫一個簡單的程序,隨機生成一個井字棋板,顯示X和Os,然後確定遊戲的結果。我的問題是,當我將字符串變量放在if/else語句的大括號中時,它告訴我它們沒有被初始化。即,它表示變量s11,s13,s21,s22,s31,s32和s33尚未初始化。然而,s12和s23是初始化的,我能看到的唯一區別是它們不在大括號內。我在哪裏犯錯了?謝謝。一些變量可能沒有被初始化?爲什麼?

import java.util.Random; 

public class Lab7 { 

public static void main(String[] args) { 

    int b11, b12, b13, b21, b22, b23, b31, b32, b33; 
    int x, o; 
    String s11, s12, s13, s21, s22, s23, s31, s32, s33; 

    x = 0; 
    o = 0; 

    Random r = new Random(); 
    b11 = r.nextInt(3); 
    b12 = r.nextInt(3); 
    b13 = r.nextInt(3); 
    b21 = r.nextInt(3); 
    b22 = r.nextInt(3); 
    b23 = r.nextInt(3); 
    b31 = r.nextInt(3); 
    b32 = r.nextInt(3); 
    b33 = r.nextInt(3); 

    if ((b11 == b12) && (b12 == b13)) 
     if (b11 == 0) 
     { 
      o = o+1; 
      s11 = "O"; 
     } 
     else if (b11 == 1) 
     { 
      x = x+1; 
      s11 = "X"; 
     } 
     else 
      s11 = ""; 
    if ((b21 == b22) && (b22 == b23)) 
     if (b21 == 0) 
     { 
      o = o+1; 
      s21 = "O"; 
     } 
     else if (b21 == 1) 
     { 
      x = x+1; 
      s21 = "X"; 
     } 
     else 
      s21 = ""; 
    if ((b31 == b32) && (b32 == b33)) 
     if (b31 == 0) 
     { 
      o = o+1; 
      s31 = "O"; 
     } 
     else if (b31 == 1) 
     { 
      x = x+1; 
      s31 = "X"; 
     } 
     else 
      s31 = ""; 

    if ((b11 == b21) && (b21 == b31)) 
     if (b11 == 0) 
      o = o+1; 
     else if (b11 == 1) 
      x = x+1; 
    if ((b32 == b22) && (b22 == b12)) 
     if (b32 == 0) 
     { 
     o = o+1; 
     s32 = "O"; 
     } 
     else if (b32 == 1) 
     { 
     x = x+1; 
     s32 = "X"; 
     } 
     else 
      s32 = ""; 
    if ((b33 == b23) && (b23 == b13)) 
     if (b33 == 0) 
     { 
     o = o+1; 
     s33 = "O"; 
     } 
     else if (b33 == 1) 
     { 
      x = x+1; 
      s33 = "X"; 
     } 
     else 
      s33 = ""; 

    if ((b22 == b11) && (b22 == b33)) 
     if (b22 == 0) 
     { 
     o = o+1; 
     s22 = "O"; 
     } 
     else if (b22 == 1) 
     { 
     x = x+1; 
     s22 = "X"; 
     } 
     else 
      s22 = ""; 
    if ((b13 == b22) && (b22 == b31)) 
     if (b13 == 0) 
     { 
      o = o+1; 
      s13 = "O"; 
     } 
     else if (b13 == 1) 
     { 
      x = x+1; 
      s13 = "X"; 
     } 
     else 
      s13 = ""; 

    if (b12 == 0) 
     s12 = "O"; 
    else if (b12 == 1) 
     s12 = "X"; 
    else 
     s12 = ""; 

    if (b23 == 0) 
     s23 = "O"; 
    else if (b23 == 1) 
     s23 = "X"; 
    else 
     s23 = ""; 

    System.out.println(s11+" "+s12+" "+s13); 
    System.out.println(s21+" "+s22+" "+s23); 
    System.out.println(s31+" "+s32+" "+s33); 
} 
} 
+5

考慮執行所有可能的路徑。 –

+0

'if/else'的's12'和's23'鏈總是導致分配。 – SJuan76

+1

即使你可以證明對於所有路徑,所有使用的變量都已經在該路徑的前面進行了分配(我沒有檢查,代碼太多),但java中的初始化檢查器非常簡單並且相當悲觀。如果您確定,只需初始化爲null或其他。 – harold

回答

0

如果if表達式的條件是假的,sxx變量將不會被初始化。他們必須始終被初始化。您可以簡單地將它們初始化爲null或空字符串。

0

它們被聲明,但不是必然初始化。爲了消除這種編譯錯誤,他們必須在中每初始化通過代碼的可能路徑。做到這一點最簡單的方法是簡單地設置您的Stringnull""當你聲明它們,即

String s11 = null; 

String s11 = ""; 
1

使用

String s11="", s12="", s13="", s21="", s22="", s23="", s31="", s32="", s33=""; 

,而不是

String s11, s12, s13, s21, s22, s23, s31, s32, s33; 
0

編譯器認識到在任何情況下s12s23都被賦予一個值。對於其他人,他們不需要,他們需要一個價值才能使用。只需寫入即可初始化每個變量。

String s11=""; 
String s12=""; 
... 
1

這是因爲您的變量可能不會被初始化,具體取決於您的代碼所需的條件。

只需在它們中加上一個空值,你的代碼應該很好。

但請記住,使用==運算符來比較兩個String對象可能會失敗。

0

錯誤意味着根據輸入,這些變量可能不會被初始化。

例如if ((b13 == b22) && (b22 == b31))它可能導致錯誤,s13不會被初始化。

String s11 = "", s12 ="" . . . .;將解決問題,但可能會導致邏輯錯誤,您可以稍後檢查。現在就去做吧。

0

使用嵌套if語句時,懸掛其他屬於內部if,而不是兩者都是。例如,如果b11不等於b12,則不會將任何內容分配給s11。最簡單的辦法是這樣的:

if ((b11 == b12) && (b12 == b13)) { 
    if (b11 == 0) 
    { 
     o = o+1; 
     s11 = "O"; 
    } 
    else if (b11 == 1) 
    { 
     x = x+1; 
     s11 = "X"; 
    } else { 
     s11 = ""; 
    } 
} 
else { 
     s11 = ""; 
} 

而且,使用大括號磨片if語句的部分橫跨多行。

+0

非常感謝。我需要學習如何記住這樣的事情。 – CSpadawan

相關問題