【问题标题】:Why am I getting an ArrayIndexOutOfBounds exception when array size defined in class?为什么在类中定义数组大小时会出现 ArrayIndexOutOfBounds 异常?
【发布时间】:2014-02-15 16:06:24
【问题描述】:

对于我的项目,用户必须定义​​数组的大小,我创建了一个 set 方法来执行此操作。被改变的变量是类变量,arraySize。但是,当有人设置数组大小时,我尝试添加一个数组,我收到 indexoutofbounds 错误。

这是代码的sn-p

    //Size of the array
private int arraySize;
//initializes elemnt count of array
private int arrayElementCount;

//Gets count of SID in array
public int getSIDArrayCount() {

    //returns private variable
    return arrayElementCount;
}

//Sets SID Array
public void setArraySize(int setArraySize) {
    //Array size int
    //checks array if array size is greater than 0
    if (setArraySize > 0) {
        //sets array size
           //SIDArray
         arraySize = setArraySize;
    }

}

//SIDArray
private String[] SIDArray = new String[arraySize];

编辑: 我无法在“setArraySize”方法中初始化数组,因为我需要数组的访问器方法。

这是课程的其余部分:

/*

* 要更改此许可标头,请在项目属性中选择许可标头。 * 要更改此模板文件,请选择工具 |模板 * 并在编辑器中打开模板。 */ 包 com.ahellhound.pkg202sidproject;

导入 java.util.Arrays; 导入 java.util.regex.Pattern;

/** * * @作者科尔比勒克莱尔 */ 公共类 SIDArrayTest {

//Size of the array
private int arraySize;
//initializes elemnt count of array
private int arrayElementCount;

//Gets count of SID in array
public int getSIDArrayCount() {

    //returns private variable
    return arrayElementCount;
}

//Sets SID Array
public void setArraySize(int setArraySize) {
    //Array size int
    //checks array if array size is greater than 0
    if (setArraySize > 0) {
        //sets array size
           //SIDArray
         arraySize = setArraySize;
    }

}

//SIDArray
private String[] SIDArray = new String[arraySize];
//Gets SID Array
public String[] getSIDArray() {

    //returns array
    return SIDArray;
}

//Validates SID; returns true if SID entry is valid
public boolean validateSID(String SIDEntry) {
    //checks if sid entry is 7, and if starts with s
    if (SIDEntry.length() != 7) {
        //retuns false
        return false;

    }

    //checks if SIDEntry begins with 'S'
    if (!SIDEntry.matches("[sS]\\d{6}")) {

        //returns false
        return false;
    }
    //returns true
    return true;
}

//Adds SID to the Array
public void addSID(String SIDEntry) {

    //checks if SID is valid
    if (validateSID(SIDEntry)) {
        //Adds sid to array
        SIDArray[arrayElementCount] = SIDEntry;
        //increases array size by one
        arrayElementCount++;

    } else {

        System.out.println("test failed 2");
    }

}

//Gets SID array and returns all entrys to strings 
public String getSIDArrayString() {
    //Gets array and converts to string
    String SIDArrayString = Arrays.toString(SIDArray);
    //returns array string
    return SIDArrayString;

}

}

当我为它创建了一个类变量,同时让数组有一个“get”-able 方法时,我真的不知道如何设置数组大小。

【问题讨论】:

    标签: java arrays class variables


    【解决方案1】:

    您在调用 setArraySize 方法之前实例化了数组,因此它的大小为 0。

    //SIDArray
    private String[] SIDArray = new String[arraySize];
    

    由于 SIDArray 变量在类的范围内,因此一旦创建了类的对象,它就会被实例化。因此,它使用 arraySize 变量,此时未实例化(如果是 int,则默认为 0)。

    要解决这个问题,只需在调用 setArraySize() 后实例化数组即可。

    这里有一些代码可以阐明我在 cmets 中的意思。

    public class A {
        /* In your code, you instantiate the array at this point, in the scope of the class, while arraySize is still uninitialized */
        String[] array; /* uninitialized, defaults to null */
        int arraySize; /* uninitialized, defaults to 0 */
    
        /* Simple accessor method for the array */
        public String[] getArray() {
            return array;
        }
    
        public int getArraySize() {
            return arraySize;
        }
    
    
        public void setArraySize(int size) {
            this.arraySize = size;
        }
    
        public void createArray() {
            array = new String[arraySize];
        }
    }
    

    【讨论】:

    • 这个问题是我需要有一个数组的访问器方法,如果在方法中初始化了数组,我就没有这个方法。
    • 你可以有一个数组的访问器方法,不管它在哪里初始化
    • 访问器方法就这么简单: public String[] getArray() { return yourArray; }
    • 但是如果它在'setArraySize'方法中,我怎样才能得到数组呢?
    • 为什么要从 setArraySize 方法返回数组?为什么你会在那个方法中有数组?班级范围很好。该方法应该并且只应该将数组大小变量设置为它的名称描述
    【解决方案2】:

    您必须在设置新大小后初始化数组变量。将您的方法更改为:

    //Sets SID Array
    public void setArraySize(int setArraySize) {
        //Array size int
        //checks array if array size is greater than 0
        if (setArraySize > 0) {
            //sets array size
            //SIDArray
            arraySize = setArraySize;
            SIDArray = new String[arraySize];
        }
    }
    

    【讨论】:

    • 感谢您的回复,但我需要一个数组的访问器方法。
    • 你已经有了数组的访问器方法!只按照我的建议更改 setArraySize 方法实现。
    【解决方案3】:

    问题是您正在实例化一个具有固定大小 (0) 的数组。这不一定是坏事......真正的问题是在你的setArraySize(int setArraySize) 方法中,你更新了你的arraySize 变量,但是数组永远不会知道这个调用!!! 你应该使用类似的东西

    SIDArray = new String[arraySize];
    

    但即使你这样做了,调整数组大小也会破坏它之前的所有内容......请注意这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      相关资源
      最近更新 更多