对变量的更改不会保留在循环之外,并且变量不会继承到其他类

时间:2018-12-08 19:41:17

标签: java for-loop variables

我想做的事情:使用扫描仪从键盘读取字符串,直到使用特定的字符串打破无限循环为止。将其保存在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扩展InputReader子类,在该子类中对它进行排序会导致问题编号

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

(我是一个流血的初学者,昨天开始认真地使用Java,我的第一个成功的项目是我从头开始编写的Minsort-Algorithm,所以请留意。并预先感谢。)

1 个答案:

答案 0 :(得分:1)

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

换句话说,array总是在您使用new InputReader()时初始化,而不是在运行readInput()方法之后初始化。这意味着arrayLength变量在创建array时尚未被修改,因此使用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原则)。
有关获取器和访问器的更多信息,请参见:Why use getters and setters/accessors?