繁体   English   中英

Java程序中if语句的作用域错误

[英]scope error in if statement in java program

至少在if语句中,我遇到了范围问题,我很确定那是我的错误所在,而且我不确定如何解决该问题(我在编程方面很陌生)。

基本上,似乎如果我在if语句中声明某些内容,则该变量(在这种情况下为结构数组)在if语句之外不存在。 但是,由于数组的大小取决于N,所以我真的需要数组声明在if / else内,那么如何解决此错误呢?

该程序使用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

您需要移动数组声明MyStruct array[]; if块。 实际上,您回答了自己的问题,当您在一个块(由{}包围的一段代码)中声明一个局部变量时,根据Java语言的作用域规则,该变量仅在该块内部可见。

您可以 ifelse执行的操作是将数组实例化为正确的大小,如下所示:

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();
}

其他人已经回答了为什么这是一个问题以及如何避免它,但是我实际上还是会改变方法。 当前,您有两个重复代码的块-为什么不避免呢?

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没有C或C#中的“结构”之类的名称。以防万一您期望某些东西其他...)

array声明放在if语句的范围之外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM