ошибка области действия в операторе if в Java-программе - PullRequest
1 голос
/ 11 марта 2012

У меня проблема с областью действия в операторе if, по крайней мере, я почти уверен, что именно в этом моя ошибка, и я не уверен, как решить проблему (я довольно нов в программирование).

По сути, кажется, что если я объявляю что-то в операторе if, переменная (в данном случае массив структур) не существует вне оператора if. Однако мне действительно нужно, чтобы объявление массива находилось внутри if / else, поскольку размер массива зависит от N, так как я могу исправить эту ошибку?

Программа на Java, и я использую Eclipse. Любое понимание очень ценится.

//declare an int (used in determining array length)
int N = 4;

//declare instance of MyClass
MyClass myClass = new MyClass();

//declare and array, then initialize each struct in that array
        if(N <= 26){
            MyStruct array[] = new MyStruct[260];
            for(int i = 0; i < array.length; i++){
                array[i] = new MyStruct();
            }
        }

        else{
            MyStruct array[] = new MyStruct[N*10];
            for(int i = 0; i < array.length; i++){
                array[i] = new MyStruct();
            }

//lots of other code goes here of stuff that needs to be done before myMethod can be called

//call a method in myClass that requires 'array' to be passed in
myClass.myMethod(array);     // ERROR - ARRAY CANNOT BE RESOLVED TO BE A VARIABLE

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Другие ответили, почему это проблема и как ее избежать, но я бы все равно изменил подход. В настоящее время у вас есть два блока с повторяющимся кодом - почему бы не избежать этого?

int length = Math.min(N, 26);
MyStruct array[] = new MyStruct[length];
for(int i = 0; i < array.length; i++) {
    array[i] = new MyStruct();
}

MyClass myClass = new MyClass();
myClass.myMethod(array);

(Обратите внимание, что имя MyStruct имеет коннотации, которые вполне могут не подходить для Java. Я понимаю, что это просто фиктивное имя, но в Java нет ничего похожего на "struct" из C или C #. На всякий случай ты ожидаешь чего-то другого ...)

2 голосов
/ 11 марта 2012

Вам необходимо переместить объявление массива MyStruct array[]; за пределы блока if. Вы ответили на свой собственный вопрос, фактически, когда вы объявляете локальную переменную внутри блока (фрагмент кода, окруженный {}), переменная будет видна только внутри этого блока в соответствии с правилами области видимости языка Java.

То, что вы можете сделать внутри блоков if или else, - создать экземпляр массива с правильным размером, например:

MyStruct[] array;

if (N <= 26) {
    array = new MyStruct[260];
    for (int i = 0; i < array.length; i++) {
        array[i] = new MyStruct();
    }
}

else {
    array = new MyStruct[N*10];
    for (int i = 0; i < array.length; i++) {
        array[i] = new MyStruct();
    }
}

Еще более коротким решением было бы:

MyStruct[] array = new MyStruct[N <= 26 ? 260 : N*10];
for (int i = 0; i < array.length; i++) {
    array[i] = new MyStruct();
}
1 голос
/ 11 марта 2012

Поместите объявление array вне области действия оператора if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...