【问题标题】:scope error in if statement in java programjava程序中if语句的范围错误
【发布时间】:2012-03-27 20:32:42
【问题描述】:

我在 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

【问题讨论】:

    标签: java if-statement scope


    【解决方案1】:

    您需要将数组声明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();
    }
    

    【讨论】:

    • 啊-我想到了,但是,唉,我希望数组大小取决于变量 N。如果 N
    • @Tabitha 我刚刚编辑了我的答案,提供了更多细节和问题的解决方案
    【解决方案2】:

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

    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# 中的“结构”之类的东西。以防万一你期待别的东西......)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        • 2017-04-28
        相关资源
        最近更新 更多