【问题标题】:changes to a variable dont remain outside the loop & variables dont inherit to other classes对变量的更改不会保留在循环之外并且变量不会继承到其他类
【发布时间】:2018-12-08 19:41:16
【问题描述】:

我想要做的:使用 Scanner 从键盘读取字符串,直到使用特定字符串来打破无限循环。将它们保存在一个arrayList中,然后将它们传递到一个长度为循环迭代次数的数组中

public class InputReader {
    ArrayList<Integer> list = new ArrayList<>(0);
    int arrayLength;
    String readInput;
    Scanner ir = new Scanner(System.in);
    void readInput() {

        for (int m=0; ;m++) {
                readInput = ir.nextLine();
                if ("q".equals(readInput)) {
                    //problem: arrayLength does not have the value of m outside the loop
                    arrayLength = m;
                    break;
                }         
                System.out.println("arrayLength: "+arrayLength);
                intInput = Integer.parseInt(readInput);
                list.add(intInput);
            }    
        }
        int[] array = new int[arrayLength];
    }
}

在循环内部 arrayLength 工作得很好,但在循环外部它没有价值,因为我初始化它没有价值。正因为如此,

System.out.println("array.length: "+array.length);

总是返回 0 并且编译器返回这个错误:

java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

当我尝试在数组中保存整数时。 1) 如何使变量的更改保持在循环之外?

2) 奇怪的观察 A:

int[] array = new int[list.size()];

尽管 list.size() 具有正确的值,即使在循环之外(通过打印检查),也会返回相同的错误。

和 B:如果我在另一个方法而不是在类中创建我的数组,然后在方法中使用它,则代码可以工作,但是这样我不能在我的其他类中使用它,尽管使用了继承或参数。

void giveOutput() {
    int[] array = new int[list.size()];
    public void giveOutput () {
        System.out.println("list.size()"+list.size());
        System.out.println("array.length:"+array.length);
        for (int n=0; n<list.size(); n++) {
            array[n] = list.get(n);
            System.out.print("array["+n+"]:"+array[n]+" ");
        }
    }
}

这会创建一个工作数组,但我不能将它交给我的 Minsort extends InputReader 子类,在该子类中对其进行排序,从而导致问题编号

3) 如何使用在其他类的方法中初始化的变量?这样我的程序也可以运行。

(我是一个血腥的初学者,昨天开始认真使用java,我的第一个成功项目是我从头开始编写的Minsort-Algorithm,请见谅。提前感谢。)

【问题讨论】:

  • 您的意图在代码中有点混乱(仔细查看大括号),所以是的,行 `int[] array = new int[arrayLength];` 在方法 @987654326 之外@,因此,它是一个实例变量,一旦创建对象就会被创建和初始化。

标签: java for-loop variables


【解决方案1】:

array 数组在实例化 InputReader 类型的对象时被初始化,而不是在 readInput() 方法运行之后。

换句话说,array 总是在你使用new InputReader() 时被初始化,而不是在readInput() 方法运行之后。这意味着在创建array 的那一刻,arrayLength 变量尚未被修改,因此使用 int 的默认值,即 0。

试试这个:

public static class InputReader {
        ArrayList<Integer> list = new ArrayList<>(0);
        int arrayLength;
        String readInput;
        Scanner ir = new Scanner(System.in);
        int[] array;
        void readInput() {

            for (int m=0; ;m++) {
                readInput = ir.nextLine();
                if ("q".equals(readInput)) {
                    //problem: arrayLength does not have the value of m outside the loop
                    arrayLength = m;
                    break;
                }

                int intInput = Integer.parseInt(readInput);
                list.add(intInput);
            }
            System.out.println("arrayLength: "+arrayLength);
            array = new int[arrayLength];
        }
    }

此外,您的 System.out.println("arrayLength: "+arrayLength); 始终返回 0,因为 arrayLength 仅在按下 q 时才会更改。

回答您的第三点:您可以在 InputReader 类中创建一个 getter 函数。例如:

    public int[] getArray() {
        return array;
    }

附带说明:使用私有访问修饰符声明实例变量,然后创建公共 getter 和 setter 是非常好的做法。这称为封装,并且是 OOP 原则(我的建议是您在 Google 上搜索 OOP 原则)。
有关 getter 和 accessors 的更多信息:Why use getters and setters/accessors?

【讨论】:

  • "数组数组是在实例化 InputReader 类型的对象时初始化的,而不是在运行 readInput() 方法之后。"不知道。很有帮助。我的代码现在正在运行。感谢您快速友好的回答;)
猜你喜欢
  • 2017-01-26
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 2016-12-04
  • 2011-04-09
相关资源
最近更新 更多