有些变量可能尚未初始化?为什么?

时间:2013-10-09 17:55:26

标签: java

在这里编程noob。我正在尝试编写一个简单的程序来随机生成一个tic-tac-toe board,显示Xs和Os,然后确定游戏的结果。我的问题是,当我将String变量放在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);
}
}

7 个答案:

答案 0 :(得分:1)

使用

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

而不是

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

答案 1 :(得分:1)

这是因为您的变量可能无法初始化,具体取决于代码所采用的条件。

只需在所有这些中加上一个空值,你的代码就可以了。

但请记住,使用==运算符来比较两个String对象可能会失败。

答案 2 :(得分:0)

如果if表达式的条件为false,则不会初始化sxx变量。必须始终初始化它们。您可以简单地将它们初始化为null或空字符串。

答案 3 :(得分:0)

它们已被声明,但必然已初始化。为了消除编译错误,必须在 每个 可能的路径中通过代码初始化它们。完成此操作的最简单方法是在声明时将String值设置为null"",即

String s11 = null;

String s11 = "";

答案 4 :(得分:0)

编译器认识到在任何情况下s12s23都会得到一个值。对于其他人他没有,他们需要一个价值才能使用。只需写入初始化每个变量。

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

答案 5 :(得分:0)

错误意味着根据输入,这些变量可能无法初始化。

例如if ((b13 == b22) && (b22 == b31))它可能导致错误,s13将不会被初始化。

使用String s11 = "", s12 ="" . . . .;将解决问题但可能导致逻辑错误,您可以稍后检查。现在就去吧。

答案 6 :(得分: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语句的各个部分跨越多行,请使用大括号。