2015-12-15 4 views
-1

это сообщение об ошибкеПродолжайте получать это сообщение об ошибке для моей программы RockPaperScissor. Как исправить эту ошибку?

----jGRASP exec: javac -g RockPaperScissorRandom.java 

RockPaperScissorRandom.java:40: error: variable computerPlay might not have been initialized 
     **System.out.println("Computer play is: " + computerPlay);** 
               ^
1 error 

----jGRASP wedge2: exit code for process is 1. 
----jGRASP: operation complete. 

это программа

 
import java.util.Scanner; 
import java.util.Random; 

public class RockPaperScissorRandom{ 
    public static void main(String[]args){ 

     String personPlay; //User's play -- "0", "1", or "2" 
     String computerPlay; //Computer's play -- "0", "1", or "2" 
     int computerInt; //Randomly generated number used to determine computer's play 

     String response; 

     Scanner scan= new Scanner(System.in); 
     Random generator = new Random(); 

     System.out.println("Hey, let's play Rock, Paper, Scissors!\n" + "Please enter a move.\n" + "Rock = 0, Paper = 1, and Scissors = 2."); 

     System.out.println(); 

     //Generate computer's play (0,1,2) 
     computerInt = generator.nextInt(3)+1; 

     //Translate computer's randomly generated play to //string using if //statements 

     if (computerInt == 1) 
     computerPlay = "0"; 
     else if (computerInt == 2) 
     computerPlay = "1"; 
     else if (computerInt == 3) 
     computerPlay = "2"; 

     //Get player's play from input-- not that this is stored as a string 
     System.out.println ("Enter your play: "); 
     personPlay = scan.next(); 

     //Make player's play uppercase ofr ease of comparison 
     personPlay = personPlay.toUpperCase(); 

     //Print computer's play 
     System.out.println("Computer play is: " + computerPlay); 

     //See who won. use nested ifs 

     if (personPlay.equals(computerPlay)) 
     System.out.println("It's a tie!"); 
     else if (personPlay.equals("0")) 
     if (computerPlay.equals("2")) 
     System.out.println("Rock crushes scissors. You WIN!!"); 
     else if (computerPlay.equals("1")) 
     System.out.println("Paper eats rock. You LOSE!!"); 
     else if (personPlay.equals("1")) 
     if (computerPlay.equals("2")) 
     System.out.println("Scissors cuts paper. You LOSE!!"); 
     else if (computerPlay.equals("0")) 
     System.out.println("Paper eats rock. You WIN!!"); 
     else if (personPlay.equals("2")) 
     if (computerPlay.equals("1")) 
     System.out.println("Scissors cuts paper. You WIN!!"); 
     else if (computerPlay.equals("0")) 
     System.out.println("Rock breaks scissors. You LOSE!!"); 
     else 
     System.out.println("Invalid user input.Computer wins by default. You LOSE!!"); 
    } 
} 
+0

я жирный шрифт строки ошибки и расположение ошибки имеет звездочки левые и справа от строки – r0bbymalz

+1

Компилятор вниз знает, что все возможные пути кода инициализируют переменную, потому что она не понимает диапазон значений для 'computerInt' (или даже для любой библиотеки). –

+0

Использование:' computerPlay = Integer.toString (generator.nextInt (3) +1); 'Удалить всех пользователей' computerInt' и любое другое присвоение 'computerPlay'. –

ответ

1

Либо присвоить пустую строку/нуль к нему:

String computerPlay = null; 

или

String computerPlay = ""; 

Вы также можете изменить ваш код немного вместо:

if (computerInt == 1) 
    computerPlay = "0"; 
else if (computerInt == 2) 
    computerPlay = "1"; 
else /* removed if (computerInt == 3)*/ 
    computerPlay = "2"; 

Таким образом, переменная computerPlay всегда будет инициализирован.

ошибка показана, так как после того, как следующий код:

computerInt = generator.nextInt(3)+1; 

computerInt равно 1 или 2, или 3, но компилятор теперь делает не то. Метод nextInt() мог возвращать что-либо с точки зрения компилятора.

1

Это значит, что computerPlay не был инициализирован. Вы делаете это:

if (computerInt == 1) 
    computerPlay = "0"; 
    else if (computerInt == 2) 
    computerPlay = "1"; 
    else if (computerInt == 3) 
    computerPlay = "2"; 

но нет значения по умолчанию для computerPlay в случае, если он не приспосабливает в любом случае, так что значение будет мусор и сделать свой сбой программы. Чтобы ваша программа скомпилировалась. Вы можете добавить значение по умолчанию компьютера Play следующим образом:

String computerPlay = ""; 

или добавив другой еще в вашей, если заявление, которое будет значение по умолчанию.

if (computerInt == 1) 
    computerPlay = "0"; 
    else if (computerInt == 2) 
    computerPlay = "1"; 
    else if (computerInt == 3) 
    computerPlay = "2"; 
    else 
    computerPlay = ""; 
4

В этом разделе можно здесь:

computerInt = generator.nextInt(3)+1; 

if (computerInt == 1) 
    computerPlay = "0"; 
else if (computerInt == 2) 
    computerPlay = "1"; 
else if (computerInt == 3) 
    computerPlay = "2"; 

computerInt гарантированно будет 1, 2 или 3, и поэтому computerPlay должны быть инициализированы. Но это не является тривиально очевидным (это требует понимания цели nextInt(int) и зная, что она правильно реализована), поэтому компилятор не знает этого. Насколько известно, computerInt может быть любым допустимым int, и большинство из этих значений приводит к тому, что computerPlay неправильно инициализируется.

Поэтому вы должны убедиться, что каждый мыслимый путь через код устанавливает значение. Это довольно простое изменение в вашем случае:

if (computerInt == 1) 
    computerPlay = "0"; 
else if (computerInt == 2) 
    computerPlay = "1"; 
else 
    computerPlay = "2"; 

Удаляя окончательный if, значение будет всегда инициализируются. Удаление этой проверки безопасно, потому что вы знаете, что если она дойдет до этого else, она будет всегда инициализирована, хотя компилятор этого не делает.

Другие параметры - установить значение по умолчанию при объявлении computerPlay (например,"") или иметь в конце else, который правильно обрабатывает случай, когда он не является ожидаемым значением (если вы позже измените код, чтобы он мог быть другим значением, например).

0

Вам необходимо инициализировать переменные в своих заявлениях декларации, если нет гарантии, что они будут инициализированы позже в программе. Например, ваши инструкции if/else-if не гарантируют инициализацию computerPlay, потому что есть вероятность, что ни одно из операторов if/else-if не будет выполнено. Чтобы это исправить, изменить эту строку кода,

String computerPlay; 

к этому

String computerPlay = ""; 

Существует исключение для этого. Когда переменные объявляются вне подпроцесса/метода, в котором они используются, тогда они не обязательно должны быть инициализированы.

0

Причина, по которой вы получаете эту ошибку, потому что это возможно (по мнению компилятора) что «computerPlay» не получает значения. Единственный раз, когда computerPlay получает назначение здесь:

if (computerInt == 1) 
    computerPlay = "0"; 
else if (computerInt == 2) 
    computerPlay = "1"; 
else if (computerInt == 3) 
    computerPlay = "2"; 

Но что, если computerInt это 4? Или 0? Или -273? Компилятор не знает, что вы ограничили значения 1, 2 и 3, поэтому он предполагает, что это возможно для любого другого числа, что означает, что computerPlay не может быть инициализирован.

Чтобы это исправить, либо изменить последний else if просто else или присвоить значение по умолчанию computerPlay в своем определении ... т.е. int computerPlay = 0;

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

  • Нет связанных вопросов^_^