【问题标题】:Some variables might not have been initialized? Why?某些变量可能尚未初始化?为什么?
【发布时间】:2013-10-09 17:55:26
【问题描述】:

这里是编程菜鸟。我正在尝试编写一个简单的程序来随机生成一个井字棋盘,显示 Xs 和 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);
}
}

【问题讨论】:

  • 考虑执行可以采取的所有路径。
  • s12s23 if/else 链总是导致分配。
  • 即使你可以证明对于所有路径,所有使用的变量都已在该路径中较早分配(我没有检查,代码太多),java中的初始化检查器非常简单并且相当悲观。如果您确定,只需初始化为 null 或其他内容。
  • 如果b11 != b12 那么s11 是什么?等等……
  • Variables 的文档可能是一个很好的更新资源。特别是关于局部变量的默认值的部分。

标签: java


【解决方案1】:

使用

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

而不是

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

【讨论】:

    【解决方案2】:

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

    只需在所有这些中输入一个空值,您的代码就可以运行了。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        String s11 = null;
        

        String s11 = "";
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            例如if ((b13 == b22) && (b22 == b31)) 可能会导致 false 并且 s13 不会被初始化。

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

            【讨论】:

              【解决方案7】:

              对于嵌套的 if 语句,悬空的 else 属于内部 if,而不属于两个 then。例如,如果 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 语句的部分跨越多行,请使用大括号。

              【讨论】:

              • 非常感谢。我需要学会记住这样的事情。
              猜你喜欢
              • 2012-03-25
              • 2015-07-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多