gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:29:34 25 4
gpt4 key购买 nike

我想要做的:使用扫描仪从键盘读取字符串,直到使用特定字符串来打破无限循环。将它们保存在一个 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算法,所以请怜悯。提前感谢。)

最佳答案

数组 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;
}

作为旁注:使用私有(private)访问修饰符声明实例变量,然后创建公共(public) getter 和 setter 是非常好的做法。这称为封装,是一个 OOP 原则(我的建议是你用 google 搜索一下 OOP 原则)。
有关 getter 和 accessors 的更多信息,请参见:Why use getters and setters/accessors?

关于java - 对变量的更改不会保留在循环之外并且变量不会继承到其他类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53686273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com