我想做的事情:使用扫描仪从键盘读取字符串,直到使用特定的字符串打破无限循环为止。将其保存在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,所以请留意。并预先感谢。)
答案 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?