有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数组。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


共 (6) 个答案

  1. # 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;
        }
    }
    
  2. # 2 楼答案

    您已将数组初始化置于构造函数之外,因此在设置最大值之前

    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. # 3 楼答案

    public class ParkingLot {
      private int max;
      ...
      private Car[] cars=new Car[max];
    

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

    1. 所有实例初始值设定项(包括初始值设定项块)都按照在源代码中出现的顺序运行
    2. 构造函数运行

    max在使用它创建cars数组时等于0

    cars的初始化移到构造函数中,注意在初始化之后使用构造函数参数或实例变量

  4. # 4 楼答案

    构造数组时,Max未初始化为任何值。因此它抛出异常,因为max不是在数组上创建的可行长度,它没有值

    在构造函数中初始化数组,它应该可以工作

    您的程序顺序是: 1:将构造函数初始化为最大长度(发生在构造函数外部 2:初始化最大值

    在构造函数中初始化数组

  5. # 5 楼答案

    max未初始化且为0,则调用构造函数,但数组已初始化

  6. # 6 楼答案

    正如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;
        }