我有一个对象数组 - 基本上是一个对象引用数组。在我引用的类中,还有另一个引用。我需要初始化这个数据结构,但在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)的行,则没有异常陷阱,所以问题出在那里。
感谢所有能够解释这一点的人......
答案 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 部分)。所以,这很好。请仔细检查代码。