2013-05-08 121 views
0

我在循環訪問類中的對象時遇到了一些問題。我在這裏寫了一個小小的演示,所以你可以按照下列步驟操作:循環遍歷類中的對象數組

Tank tanks[] = new Tank[2]; 
tanks[0] = new Tank(); 
tanks[1] = new Tank(); 
tanks[0].doStuff(tanks); 

doStuff(Tank[] tanks) { 
    for (int i = 0; i < tanks.length; i++) { 
     if (tanks[i].equals(this)) continue; 
     // Do stuff 
    } 
} 

所以,我有一個類型爲Tank的數組。然後我調用Tank類中的doStuff方法。該方法獲取數組並循環遍歷它。然後我想爲每個坦克都做些東西,而不是這個班的當前實例。我希望你能從我的代碼和這個描述中理解。

的問題是,我得到的NullPointerException爲if (tanks[i].equals(this))

我在做什麼錯在這裏?

+2

該代碼無論如何都不會編譯,因爲你試圖把一個單一值('坦克tanks' )作爲一個數組。請修改您的問題以提供一個簡短的*完整*程序來展示問題。 – 2013-05-08 15:45:25

+0

你有沒有重新實現equals方法?如果是,你可以展示它嗎?這是我認爲這個null可能來自的唯一的地方,但只有當你重新實現它並做了錯誤的時候。其餘的都很乾淨。 – 2013-05-08 15:46:21

+0

@JonSkeet你可以使用該語法來創建一個數組。這很奇怪,但他將其聲明爲變量名稱中的數組。 – 2013-05-08 15:48:04

回答

8

這意味着tanks[i]爲空。 (或者您的覆蓋equals()方法有bug)

您需要檢查。

+2

更可能後者,由於相對基本所提供的代碼的性質。 – 2013-05-08 15:45:18

+2

@AnthonyGrist:鑑於所提供的代碼無法編譯(即使在被靜默編輯之後),我強烈懷疑它並不代表正在運行的真實代碼。 – 2013-05-08 15:50:21

1

當我運行這段代碼:

public class Tank { 
    public static void main(String[] args) { 
    Tank tanks[] = new Tank[2]; 
    tanks[0] = new Tank(); 
    tanks[1] = new Tank(); 
    tanks[0].doStuff(tanks); 
    } 

    public void doStuff(Tank[] tanks) { 
     for (int i = 0; i < tanks.length; i++) { 
      if (tanks[i].equals(this)) continue; 
      // Do stuff 
     } 
    } 
} 

沒有錯誤發生。因此,您可能會覆蓋.equals,這就是NullPointerException發生的位置。另一種可能性是你的簡單示例不能準確地反映你的bug發生的地方。

1

,如果你想比較你的對象的ID,您可以使用==代替.equals()

doStuff(Tank tanks) { 
    for (int i = 0; i < tanks.length; i++) { 
    if (tanks[i] == this) { 
     continue; 
     } 
    // Do stuff 
    } 
}