数组。lang.ArrayIndexOutOfBoundsException:0
给定以下代码
package parkinglottest;
public class ParkingLotTest {
public static void main(String[] args) {
ParkingLot p=new ParkingLot(15);
System.out.println(p.getMax());
Car c1=new Car(1);
Car c2=new Car(2);
p.addCar(c1);//at parkinglottest.ParkingLotTest.main(ParkingLotTest.java:14)
p.addCar(c2);
}
}
package parkinglottest;
public class ParkingLot {
private int max;
public ParkingLot(int max)
{
this.max=max;
}
private Car[] cars=new Car[max];//if instead of "max" i put any other positive integer, it works just fine.
int nr=0;
public void addCar(Car c)
{
cars[nr++]=c; //at parkinglottest.ParkingLot.addCar(ParkingLot.java:17)
}
public int getMax(){
return max;
}
}
我有一个ArrayIndexOutOfBoundsException
# 1 楼答案
如果您遵守通常的惯例,您可以这样编写您的类:
更明显的是
cars
数组初始化时,构造函数主体还没有运行,所以max有默认值:0。在初始化max
之后,需要在构造函数内初始化数组:# 2 楼答案
您已将数组初始化置于构造函数之外,因此在设置最大值之前
# 3 楼答案
请记住初始化代码的执行顺序:
max
在使用它创建cars
数组时等于0
将
cars
的初始化移到构造函数中,注意在初始化之后使用构造函数参数或实例变量# 4 楼答案
构造数组时,Max未初始化为任何值。因此它抛出异常,因为max不是在数组上创建的可行长度,它没有值
在构造函数中初始化数组,它应该可以工作
您的程序顺序是: 1:将构造函数初始化为最大长度(发生在构造函数外部 2:初始化最大值
在构造函数中初始化数组
# 5 楼答案
max未初始化且为0,则调用构造函数,但数组已初始化
# 6 楼答案
正如ZouZou提到的,您必须在构造函数中初始化您的car数组,因为
max
参数仅在该范围内可用编辑以澄清:在调用构造函数之前创建并初始化字段变量。因此,当您在构造函数外部初始化cars数组时,您使用字段变量
max
的值初始化它,该变量被初始化为0(因为int不能为null)