在循环内定义的Java变量似乎在循环外部无法识别?

3

我有一段代码让我感到困惑。因为数组的长度取决于方法输入的两个参数的长度,所以我在if/else语句内定义了一个整数数组。我的问题是,在if/else语句外部,变量定义似乎被丢失了。

import java.util.Arrays;

public class test {

  public String AddArrays(int [] arg1, int [] arg2) {
    int L1 = arg1.length;
    int L2 = arg2.length;
    if (L1 > L2) {
        int[] output = new int[L2];
        for (int i = 0; i < L2; i++) {
            output[i] = arg1[i] + arg2[i];
        }
    } else {
        int[] output = new int[L1];
        for (int i = 0; i < L2; i++) {
            output[i] = arg1[i] + arg1[i];
        }
    }
    String result = Arrays.toString(output);
    return result;
    }
}

我得到的错误是在语句 String result = Arrays.toString(output); 上,Eclipse告诉我output 无法解析为变量。
顺便说一下,是的,我知道这不是将两个整数数组相加的方法--我从更复杂的代码中简化了它,以演示问题!

4
好的,我会尽力为您翻译以下内容:Java变量范围当您在Java程序中定义变量时,它们只能在特定的区域(称为变量范围)内使用。这是因为Java遵循一些严格规则以确保变量被正确使用和妥善处理。Java有三种变量范围:局部、实例和静态。局部变量只能在定义它们的方法或块中使用,而实例变量和静态变量可以在整个类中使用。局部变量的作用域通常限于方法或块,但如果在该方法或块之外定义,则无法访问局部变量。另外,局部变量声明后必须先初始化,才能在其作用域内使用。实例变量是在类中定义的变量,每个类的实例都有自己的实例变量副本。实例变量可以是公共的、私有的或受保护的,并且可以在类的任何方法中使用。但如果在方法之外引用实例变量,则需要使用对象引用来调用它们。静态变量是在类中定义的变量,但是它们不属于任何类的实例。静态变量只有一个副本,并在整个类中共享。静态变量可以是公共的、私有的或受保护的,并且可以在类的任何方法中使用。理解变量范围是Java编程的重要方面,因为它有助于避免一些常见的错误和问题。 - madhead
我同意。按设计工作。不是一个真正的问题。 - user207421
4个回答

5

if语句之前定义output。就像这样:

int[] output;
int L1 = arg1.length;
int L2 = arg2.length;
if (L1 > L2) {
    output = new int[L2];
    for (int i = 0; i < L2; i++) {
        output[i] = arg1[i] + arg2[i];
    }
} else {
    output = new int[L1];
    for (int i = 0; i < L2; i++) {
        output[i] = arg1[i] + arg1[i];
    }
}
String result = Arrays.toString(output);
return result;
}

当您在if语句中声明output时,它仅具有该块范围。

但是 output 的长度取决于 if/then 结果。如果 arg1 更大,则长度应该为 L2,如果 arg2 更大,则长度应该为 L1。还是我应该使用不同的方法?谢谢。 - lynvie
但是你还没有创建对象。你只是声明 output 将是一个数组。这样你就说:“嘿,我知道我将使用 int 数组 output,但我还不知道如何初始化它,但保持冷静。我会在几个指令后初始化它。” - Adam Sznajder

3
变量的作用域总是在下一个封闭的 { } 中。

当然,这从其声明开始(而不是从 { 开始)。


2

好的,您已经找到了解决方案,但是我想指出,您可以减少方法,避免重复代码,这是您目前正在做的。

您可以利用条件运算符根据L1 > L2的结果创建数组。而且,不要迭代到L1L2,应该迭代到数组output的长度。

因此,您可以尝试使用以下代码:

public String addArrays(int [] arg1, int [] arg2) {
    int L1 = arg1.length;
    int L2 = arg2.length;

    int[] output = L1 > L2 ? new int[L2]: new int[L1];

    for (int i = 0; i < output.length; i++) {
        output[i] = arg1[i] + arg2[i];
    }

    return Arrays.toString(output);
}

请遵循Java命名规范。方法名应以小写字母开头。


0
你正在将输出变量声明为 if/else 语句中的局部变量。要解决此问题,请先在外部声明它,然后调整并返回结果。这将使其保持在大括号 { } 之间的范围内。
public String AddArrays(int [] arg1, int [] arg2) {
    int L1 = arg1.length;
    int L2 = arg2.length;
    int[] output;
    if (L1 > L2) {
        output = new int[L2];
        for (int i = 0; i < L2; i++) {
            output[i] = arg1[i] + arg2[i];
        }
    } else {
        output = new int[L1];
        for (int i = 0; i < L2; i++) {
            output[i] = arg1[i] + arg1[i];
        }
    }
    String result = Arrays.toString(output);
    return result;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接