2015-04-06 90 views
0

变量这段代码是胡扯游戏(java的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 
+0

这在任何Java教程中都有介绍。 –

回答

0

需要初始化myPoint因为不是通过代码,导致第一次使用的变量(即sumOfDice == myPointif内)的所有路径进行分配,以myPoint

特别是,如果sumOfDice等于落在default情况下,switch声明的任何值会发生这种事。

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

+0

你的意思是即使是没有被使用的局部变量,它们也必须初始化? –

+0

@hamid_c如果你不使用局部变量,你不必初始化它。但是如果你可以在某些情况下使用你的局部变量,它必须被初始化。 – dasblinkenlight

0

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

这就是为什么你总是在需要初始化你的Java本地变量。如果不是这样,编译器会发出抱怨