java.lang.ArrayIndexOutOfBoundsException:0

时间:2014-01-11 12:51:20

标签: java arrays indexoutofboundsexception

给出以下代码

  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。

7 个答案:

答案 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];

请记住初始化代码的执行顺序:

  1. 所有实例初始化程序按源中出现的顺序运行(包括初始化程序块);
  2. 构造函数运行。
  3. 在您使用它创建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}}移到构造函数中。

为了避免这个难题,新手可能建议避免使用这样的初始化器,特别是那些依赖于其他值的初始化器。