给出以下代码
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。
答案 0 :(得分:3)
正如ZouZou所提到的,您必须在构造函数中初始化您的car数组,因为max
参数仅在该范围内可用。
编辑以澄清:在调用构造函数之前创建并初始化字段变量。因此,当您在构造函数外部初始化cars数组时,使用字段变量max
的值初始化它,该值初始化为0(因为int不能为null)。
package parkinglottest;
public class ParkingLot {
private int max;
public ParkingLot(int max)
{
this.max=max;
this.cars=new Car[max];
}
private Car[] cars;
int nr=0;
public void addCar(Car c)
{
cars[nr++]=c; //at parkinglottest.ParkingLot.addCar(ParkingLot.java:17)
}
public int getMax()
{
return max;
}
答案 1 :(得分:1)
max未初始化且为0,则调用构造函数,但该数组已初始化
答案 2 :(得分:1)
您已将数组初始化置于构造函数之外,因此在设置max之前。
public class ParkingLot {
private int max;
private int nr;
private Car[] cars; // it was like saying = new Car[0], because max was 0.
public ParkingLot(int max)
{
this.max = max;
this.cars = new Car[max];
}
答案 3 :(得分:1)
public class ParkingLot {
private int max;
...
private Car[] cars=new Car[max];
请记住初始化代码的执行顺序:
max
数组时, 0
等于cars
。
将cars
的初始化移动到构造函数中,并注意在初始化之后使用构造函数参数或实例变量。
答案 4 :(得分:1)
如果您尊重通常的惯例,您可以像这样编写您的课程:
public class ParkingLot {
private int 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 ParkingLot(int max) {
this.max = max;
}
public void addCar(Car c) {
cars[nr++] = c;
public int getMax() {
return max;
}
}
更明显的是,在初始化cars
数组时,构造函数体尚未运行,因此max具有默认值:0。您需要初始化内部的数组构造函数,max
初始化后:
public class ParkingLot {
private int max;
private Car[] cars;
int nr = 0;
public ParkingLot(int max) {
this.max = max;
this.cars = new Car[max];
}
public void addCar(Car c) {
cars[nr++] = c;
}
public int getMax() {
return max;
}
}
答案 5 :(得分:0)
构造数组时,Max尚未初始化为任何内容。所以它抛出异常,因为max不是在数组上创建的可行长度,它没有价值。
在构造函数中初始化数组,它应该可以工作。
您的计划顺序是: 1:将构造函数初始化为max(发生在构造函数外部) 2:初始化最大值
在构造函数中初始化数组。
答案 6 :(得分:0)
在你弄清楚Java初始化方案之前,这可能是一个难题。
任何方法之外的语句(非简单声明)都被认为是静态的(如果前面有static
关键字)或实例(如果没有static
)初始值设定项。因此,它们被收集到两个未命名的方法中(一个用于static
,一个用于static
。加载类时执行private Car[] cars;
初始化方法。实例初始化方法在调用任何构造函数之前执行。
在您的情况下,您希望将cars=new Car[max];
保留在原来的位置,但将{{1}}移到构造函数中。
为了避免这个难题,新手可能建议避免使用这样的初始化器,特别是那些依赖于其他值的初始化器。