2016-03-02 2 views
2

Я начинаю изучать Java, в этом примере, которые пытаются имитировать игру с кубиками.Локальная инициализация переменных и выбор переключателя

Ошибка компилятора появляется, когда я не инициализирую переменную myPoint, поэтому я установил ее в ноль перед конструкцией switch.

Я хочу понять, почему мне нужно инициализировать переменную 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 
+2

http://stackoverflow.com/questions/1560685/why-must- local-variables-including-primitives-always-be-initialized-in-java –

+0

Код, который вы предоставили, не сработает, если myPoint не инициализирован. Вероятно, вы используете переменную myPoint где-то вне блока 'default', где она может быть неинициализирована. – pkalinow

ответ

2

Согласно Java specification

локальной переменной (§14.4, §14.14) должен быть явно присвоено значение перед его использованием, либо инициализации (§14.4) или присваивания (§15.26), в который может быть проверен с использованием правил для определенного назначения (§16).

rules для оператора switch эффективно принуждает вас инициализировать вашу переменную в каждом возможном пути выполнения для оператора switch.

Так что ответ:

  • gameStatus переменные инициализируются в каждом возможном пути выполнения через заявление переключателя, поэтому компилятор доволен.
  • myPoint не будет инициализирован, если, например, sumOfDice были SEVEN, поэтому силы компилятора инициализировать переменную вне блока переключателей
0

В вашем switch-case, любой путь будет инициализировать переменную gameStatus.

Это не касается myPoint, поэтому компилятор жалуется на отсутствие инициализации.

Смежные вопросы