2016-03-02 18 views
2

我是学习java的新手,在本例中试图模拟掷骰子游戏。局部变量初始化和开关选择

当我没有初始化变量myPoint时出现编译器错误,所以我在switch构造之前将其设置为零。

我想知道为什么我需要声明之后,当它的值设置为开关内sumOfDice值初始化变量myPoint不像gameStatus变量?

/***** roll dice game ****/ 

//some code here.. 

    private enum Status { CONTINUE, WON, LOST }; 

    // plays one game of craps 
    public static void main(String[] args) 
    { 
     // point if no win or loss on first roll 
     int myPoint = 0; 
     Status gameStatus; // can contain CONTINUE, WON or LOST 

     int sumOfDice = rollDice(); // first roll of the dice 

     // determine game status and point based on first roll 
     switch (sumOfDice) 
     { 
     case SEVEN: // win with 7 on first roll 
     case YO_LEVEN: // win with 11 on first roll   
      gameStatus = Status.WON; 
      break; 
     case SNAKE_EYES: // lose with 2 on first roll 
     case TREY: // lose with 3 on first roll 
     case BOX_CARS: // lose with 12 on first roll 
      gameStatus = Status.LOST; 
      break; 
     default: // did not win or lose, so remember point   
      gameStatus = Status.CONTINUE; // game is not over 
      myPoint = sumOfDice; // remember the point 
      System.out.printf("Point is %d\n", myPoint); 
      break; // optional at end of switch 
     } // end switch 

// rest of the code here .. 

     // display won or lost message 

    // roll dice, calculate sum and display results 
    public static int rollDice() 
    { 
     // return sum of dice 
    } 
} // end class Craps 
+2

http://stackoverflow.com/questions/1560685/why-must-外可变初始化,例如,分别为sumOfDiceSEVEN,因此编译器力local-variables-including-primitives-always-be-initialized-in-java –

+0

如果myPoint未初始化,您提供的代码不会失败。您可能会在'default'块之外的某处使用myPoint变量,它可能未初始化。 – pkalinow

回答

2

根据Java specification

局部变量(§14.4,§14.14)必须被明确地给出的值在使用之前,通过任一初始化(§14.4)或分配(§15.26),在一个可以使用明确赋值规则验证的方式(第16节)。

switch语句的rules有效地强制您在switch语句的每个可能的执行路径中初始化您的变量。

所以答案是:

  • gameStatus变量是在通过switch语句所有可能的执行路径初始化,因此编译器是满意的。
  • myPoint不会如果初始化开关块
0

在你switch-case,任何路径将初始化gameStatus变量。

这不是myPoint的情况,所以编译器会抱怨缺少的初始化。