在java中声明和初始化变量

时间:2015-04-06 17:21:18

标签: java variables initializing

此代码适用于掷骰子游戏(Deitel java如何编程)

为什么myPoint变量需要初始化,如果不是,则会发生编译错误?

我的意思是如果第一次掷骰中有赢或输,则无需初始化mypoint(因为它不再被使用)

如果第一次掷骰没有赢或输,myPoint会在开关默认标签

中获得值
import java.util.Random;

public class Craps 
{
   // create random number generator for use in method rollDice
   private static final Random randomNumbers = new Random(); 

   // enumeration with constants that represent the game status
   private enum Status { CONTINUE, WON, LOST };

   // constants that represent common rolls of the dice
   private static final int SNAKE_EYES = 2;
   private static final int TREY = 3;
   private static final int SEVEN = 7;
   private static final int YO_LEVEN = 11;
   private static final int BOX_CARS = 12;

   // plays one game of craps
   public static void main( String[] args )
   {
      int myPoint = 0; // point if no win or loss on first roll
      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 

      // while game is not complete
      while ( gameStatus == Status.CONTINUE ) // not WON or LOST
      { 
         sumOfDice = rollDice(); // roll dice again

         // determine game status
         if ( sumOfDice == myPoint ) // win by making point
            gameStatus = Status.WON;
         else 
            if ( sumOfDice == SEVEN ) // lose by rolling 7 before point
               gameStatus = Status.LOST;
      } // end while 

      // display won or lost message
      if ( gameStatus == Status.WON )
         System.out.println( "Player wins" );
      else
         System.out.println( "Player loses" );
   } // end main

   // roll dice, calculate sum and display results
   public static int rollDice()
   {
      // pick random die values
      int die1 = 1 + randomNumbers.nextInt( 6 ); // first die roll
      int die2 = 1 + randomNumbers.nextInt( 6 ); // second die roll

      int sum = die1 + die2; // sum of die values

      // display results of this roll
      System.out.printf( "Player rolled %d + %d = %d\n", 
         die1, die2, sum );

      return sum; // return sum of dice
   } // end method rollDice
} // end class Craps

2 个答案:

答案 0 :(得分:0)

您需要初始化myPoint,因为通过代码导致首次使用变量的所有路径(即sumOfDice == myPoint内的if)都不会对{myPoint进行分配1}}。

具体而言,如果sumOfDice等于在<{1}} default语句的switch案例之外的任何值,就会发生这种情况。

与默认初始化的成员变量不同,需要显式初始化局部变量。如果编译器找到使用未分配变量的路径,则会产生错误。

答案 1 :(得分:0)

Java中的局部变量是在堆栈上创建的。在运行时,它不知道该内存位置会是什么,所以这被认为是“垃圾”。编译器/运行时不初始化局部变量,只初始化实例(和静态)变量。

这就是总是需要在Java中初始化本地变量的原因。如果没有,编译器会抱怨