Java: ошибка «не могу найти символ» строки [], определенной в цикле - PullRequest
1 голос
/ 17 апреля 2010

Вот соответствующий код:

public static String[] runTeams (String CPUcolor) 
{  
    boolean z = false ; 
    //String[] a = new String[6] ; 
    boolean CPU = false ; 
    while (z == false) 
    { 
        while (CPU==false) 
        {
            String[] a = assignTeams () ; 
            printOrder (a) ;

            for (int i = 1; i<a.length; i++) 
            { 
                if (a[i].equals(CPUcolor)) CPU = true ;
            }
            if (CPU==false) 
            {
                System.out.println ("ERROR YOU NEED TO INCLUDE THE COLOR OF THE CPU IN THE TURN ORDER") ; 
            }
        }
        System.out.println ("is this turn order correct? (Y/N)") ; 
        String s = getIns () ; 
        while (!((s.equals ("y")) || (s.equals ("Y")) || (s.equals ("n")) || (s.equals ("N")))) 
        {
            System.out.println ("try again") ; 
            s = getIns () ; 
        } 
        if (s.equals ("y") || s.equals ("Y") ) 
        z = true ; 
    } 
    return a ; 
}

ошибка, которую я получаю:

Risk.java:416: cannot find symbol
symbol  : variable a
location: class Risk
        return a ; 
               ^

Почему я получил эту ошибку? Кажется, что a четко определено в строке String[] a = assignTeams () ; and if anything is used by the line printOrder (a); `мне кажется, что если символ a действительно не может быть найден, то компилятор должен взорваться там, а не в ответной инструкции.

(также метод assignTeams возвращает массив строк.)

Ответы [ 3 ]

7 голосов
/ 17 апреля 2010

Переменная a определена в области действия цикла while (CPU==false) - она ​​не доступна вне области действия цикла while. Вам нужно определить a внутри самой внешней области (той же, в которой находится оператор return). Вы можете оставить присвоение там, где оно есть, или, если это возможно, сделать это одновременно с определением.

public static String[] runTeams (String CPUcolor) 
{  
    boolean z = false ; 
    String[] a = null; // define a here, assign to null value
    boolean CPU = false ; 
    while (z == false) 
    { 
        while (CPU==false) 
        {
            a = assignTeams () ; // assign a here
            printOrder (a) ;

            for (int i = 1; i<a.length; i++) 
            { 
                if (a[i].equals(CPUcolor)) CPU = true ;
            }
            if (CPU==false) 
            {
                System.out.println ("ERROR YOU NEED TO INCLUDE THE COLOR OF THE CPU IN THE TURN ORDER") ; 
            }
        }
        System.out.println ("is this turn order correct? (Y/N)") ; 
        String s = getIns () ; 
        while (!((s.equals ("y")) || (s.equals ("Y")) || (s.equals ("n")) || (s.equals ("N")))) 
        {
            System.out.println ("try again") ; 
            s = getIns () ; 
        } 
        if (s.equals ("y") || s.equals ("Y") ) 
        z = true ; 
    } 
    return a ; 
}
2 голосов
/ 18 апреля 2010

JLS 14.4.2 Объем объявлений локальных переменных :

Область объявления локальной переменной в блоке - это остальная часть блока, в котором появляется объявление, начиная с его собственного инициализатора и включая любые дальнейшие деклараторы справа в оператор объявления локальной переменной.

JLS 14,2 блоков

A block - это последовательность операторов, объявлений локальных классов и операторов объявлений локальных переменных в фигурных скобках.

То, как вы объявили и инициализировали a, на самом деле это локальная переменная для блока while (CPU==false), и она сразу выходит из области видимости в конце этого блока.

Похожие вопросы


Следует также отметить, что привычка явно сравнивать с boolean константами плохая. То есть вместо:

while (z == false)
while (CPU==false) 
if (CPU==false) 

Вы должны были использовать:

while (!z)
while (!CPU) 
if (!CPU) 

Вы также можете переименовать переменные для лучшей читабельности (isXXX обычно является хорошим описательным именем), но самое малое, что вы можете сделать, это всегда делать следующие переписывания:

b == true  ---> b
b == false ---> !b
b != true  ---> !b
b != false ---> b

Как последний совет, изучение регулярных выражений не повредит. То есть вместо:

((s.equals ("y")) || (s.equals ("Y")) || (s.equals ("n")) || (s.equals ("N")))

Вы можете просто написать следующее:

s.matches("y|Y|n|N")

Учебные ресурсы

0 голосов
/ 12 мая 2010

Подобные проблемы, очевидно, решаются с помощью IDE, таких как Eclipse. Какой IDE вы используете?

...