0

我有一个对象数组 - 所以本质上是一个对象引用数组。在我引用的类中,还有另一个引用。我需要初始化这个数据结构,但在初始化期间,它崩溃了。我试图在被引用的类中初始化引用,但它始终保持为空,所以有一些我还不理解的 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)的行,则没有异常陷阱,所以问题就在那里。

感谢任何可以向菜鸟解释这一点的人...

4

3 回答 3

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();
于 2017-01-29T04:30:08.583 回答
0

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

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

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

于 2012-06-25T21:58:46.593 回答
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();
    }
}
于 2012-06-25T21:55:37.050 回答