Java数组对象在初始化期间崩溃

时间:2012-06-25 21:45:56

标签: java arrays

我有一个对象数组 - 基本上是一个对象引用数组。在我引用的类中,还有另一个引用。我需要初始化这个数据结构,但在init期间,它崩溃了。我试图初始化引用类中的引用,但它始终保持为null,因此有一些Java“事物”我还不明白。这看起来如此简单却令人沮丧。以下是问题的一个愚蠢的例子:

public class ref1
{
    public int myInt;
}
public class ref2
{
    public ref1 myRef;
}
public ref2 buffer[];
int i;

// Code to initialize the above data structures:
buffer = new ref2[255];
for (i=0; i<255; i++)
{
    buffer[i] = new ref2();
    buffer[i].myRef = new ref1();   // (1) ALWAYS returns null????
}

最终,上面的代码会在我拥有(1)标记的行中以“ArrayOutOfBoundsException”崩溃。我在调试器中注意到的第二件事是myRef总是设置为null。为什么我无法创建和引用ref1对象?????

如果我注释掉标有(1)的行,则没有异常陷阱,所以问题出在那里。

感谢所有能够解释这一点的人......

3 个答案:

答案 0 :(得分:1)

salam package cruft;

/**
 * BadRef description here
 * @author Michael
 * @link
 * @since 6/25/12 5:53 PM
 */
public class BadRef {

    public static void main(String[] args) {
        ref2 buffer[] =  new ref2[255];
        for (int i = 0; i < 255; ++i) {
            buffer[i] = new ref2();

答案 1 :(得分:0)

这对我来说很好。我不知道你在做什么:

package cruft;

/**
 * BadRef description here
 * @author Michael
 * @link
 * @since 6/25/12 5:53 PM
 */
public class BadRef {

    public static void main(String[] args) {
        ref2 buffer[] =  new ref2[255];
        for (int i = 0; i < 255; ++i) {
            buffer[i] = new ref2();
            buffer[i].myRef = new ref1();
            buffer[i].myRef.myInt = i;
            System.out.println(buffer[i]);
        }
    }
}


class ref1 {
    public int myInt;

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("ref1");
        sb.append("{myInt=").append(myInt);
        sb.append('}');
        return sb.toString();
    }
}

class ref2 {
    public ref1 myRef;

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append("ref2");
        sb.append("{myRef=").append(myRef);
        sb.append('}');
        return sb.toString();
    }
}

答案 2 :(得分:0)

如果你在每次迭代时检查buffer [i] .myRef的值,那么每次都会为null。这是正确的,因为在每次迭代时,buffer [i]是一个新的ref2实例,具有null myRef字段。 ref2实例存储在数组的先前位置。

因此,在调试器中,如果展开buffer []数组值,您将在当前位置下方的位置看到先前构造的对象。

至于ArrayOutOfBoundsException ...我假设你实际上是指ArrayIndexOutOfBoundsException(如果不是这样,请纠正我)。在这种情况下,正确设置边界。你正在创建一个255个位置的数组,你正确地将它从0迭代到254( i&lt; 255 部分)。所以,这很好。请仔细检查代码。