Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 局部变量初始化和开关选择_Java - Fatal编程技术网

Java 局部变量初始化和开关选择

Java 局部变量初始化和开关选择,java,Java,我是学习java的新手,在这个例子中,我尝试模拟掷骰子游戏 当我没有初始化myPoint变量时,会出现编译器错误,所以在switchconstruct之前,我将其设置为零 我想了解为什么在声明后将myPoint变量的值设置为开关内sumOfDice的值时,我需要初始化该变量,与gameStatus变量不同 /***** roll dice game ****/ //some code here.. private enum Status { CONTINUE, WON, LOST

我是学习java的新手,在这个例子中,我尝试模拟掷骰子游戏

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

我想了解为什么在声明后将
myPoint
变量的值设置为开关内
sumOfDice
的值时,我需要初始化该变量,
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

在您的
开关情况下
,任何路径都将初始化
gameStatus
变量

对于
myPoint
,情况并非如此,因此编译器会抱怨缺少初始化。

根据

局部变量(§14.4,§14.14)在使用前必须通过初始化(§14.4)或赋值(§15.26)明确给定一个值,其方式可以使用明确赋值规则(§16)进行验证

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

因此答案是:

  • gameStatus
    变量通过switch语句在每个可能的执行路径中初始化,因此编译器感到满意
  • myPoint
    不会被初始化,例如,
    sumOfDice
    SEVEN
    ,因此编译器强制您在开关块之外初始化变量

如果myPoint未初始化,您提供的代码不会失败。您可能在
default
块之外的某个地方使用myPoint变量,在那里它可能未初始化。