【问题标题】:java.lang.ArrayIndexOutOfBoundsException:0java.lang.ArrayIndexOutOfBoundsException:0
【发布时间】:2014-01-30 11:53:06
【问题描述】:

给定以下代码

  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。

【问题讨论】:

  • 问题是什么?
  • 仅仅因为你的初始化遵循代码中的构造函数并不意味着这是执行顺序。
  • 只需检查 logcat 并发布错误是什么
  • 我不明白为什么在声明这样的数组时会出现 outOfBoundsException:private Car[] cars=new Car[max];
  • 但如果我这样声明:private Car[] cars=new Car[10];整个程序运行良好

标签: java arrays indexoutofboundsexception


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    public class ParkingLot {
      private int max;
      ...
      private Car[] cars=new Car[max];
    

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

    1. 所有实例初始化程序都运行(包括初始化程序块),按照在源中出现的顺序;
    2. 构造函数运行。

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

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

    【讨论】:

      【解决方案3】:

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

      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];
         }
      

      【讨论】:

        【解决方案4】:

        正如邹邹所说,你必须在构造函数中初始化你的汽车数组,因为max参数只在那个范围内可用。

        编辑澄清:在调用构造函数之前创建和初始化字段变量。因此,当您在构造函数之外初始化汽车数组时,您使用已初始化为 0 的字段变量 max 的值对其进行了初始化(因为 int 不能为空)。

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

        【讨论】:

        • 解释不正确。如果 max 不可用,他会得到一个编译错误。 max 可用,但它有其默认字段值:0。
        【解决方案5】:

        如果你尊重通常的约定,你会这样写你的类:

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

        【讨论】:

          【解决方案6】:

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

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

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

          在构造函数中初始化数组。

          【讨论】:

            【解决方案7】:

            在您弄清楚 Java 初始化方案之前,这可能有点令人困惑。

            任何方法之外的语句(不是简单的声明)都被认为是静态的(如果前面有 static 关键字)或实例(如果没有 static初始化程序。因此,它们被收集到两个未命名的方法中(一个用于static,一个不用于)。 static 初始化方法在加载类时执行。实例初始化方法在调用任何构造函数之前执行。

            在您的情况下,您想将private Car[] cars; 留在原处,但将cars=new Car[max]; 移动到构造函数中。

            为避免这个难题,建议新手避免使用此类初始化程序,尤其是那些依赖于其他值的初始化程序。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-06-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-20
              • 2012-04-07
              相关资源
              最近更新 更多