2012-06-25 63 views
0

我有一個對象數組 - 所以本質上是一個對象引用數組。在我參考的課堂內部,有另一個參考。我需要初始化這個數據結構,但在初始化期間,它會崩潰。我試圖在被引用的類中初始化引用,但它始終爲空,所以存在一些我不明白的Java「事物」。這看起來很簡單,但很令人沮喪。這裏的問題的一個簡單化向下例如: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???? 
} 

最終上面的代碼將與「ArrayOutOfBoundsException」在這裏我有(1)標記的線崩潰。我在調試器中注意到的第二件事是myRef總是設置爲null。爲什麼我不能創建和引用ref1對象?????

如果我註釋掉標有(1)的行,沒有異常陷阱,所以問題就在那裏。

感謝的人誰可以解釋這一個總的小白......

+5

如果您將代碼顯示爲可重現錯誤的可編譯示例,那麼弄清楚發生了什麼會容易得多。在修復語法錯誤後,你發佈的內容對我來說運行得很好 – Affe

+0

對我來說也很好。 –

+1

如果您按照@Affe的建議操作,則可能會隔離錯誤,並且無需我們的幫助即可識別並修復錯誤。 –

回答

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

我肯定會鼓勵你添加一些關於這個的上下文/解釋(而不是僅有代碼的答案),因爲這會使答案更有用。 – EJoshuaS

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(); 
    } 
} 
0

如果你檢查在每次迭代緩衝區的值[I] .myRef,它真的會空每次。這是正確的,因爲在每次迭代中,buffer [i]是一個新的ref2實例,其中有一個空的myRef字段。 ref2實例存儲在數組的以前位置。

因此,在調試器中,如果展開buffer []數組值,您將在當前位置下方的位置看到先前構造的對象。

至於ArrayOutOfBoundsException ...我假設你實際上指的是ArrayIndexOutOfBoundsException(如果不是這種情況,請糾正我)。在這種情況下,邊界被正確設置。您正在創建一個255位數組,並且您正確地從0到254迭代它(部分)。所以,這工作正常。請仔細檢查代碼。